식에서 $없이 변수 확장이 작동하는 이유는 무엇입니까?


15
#!/bin/bash

VALUE=10

if [[ VALUE -eq 10 ]]
then
    echo "Yes"
fi

놀랍게도, 이것은 "Yes"를 출력합니다. 나는 그것이 필요할 것으로 예상했다 [[ $VALUE -eq 10 ]]. 의 CONDITIONAL EXPRESSIONS섹션을 스캔 man bash했지만이 동작에 대해 설명 할 내용이 없습니다.

답변:


11

[[은 bash 예약어이므로,와 같이 산술 확장과 같은 특수 확장 규칙이 적용됩니다 [. 또한 산술 이진 연산자 -eq가 사용됩니다. 따라서 쉘은 정수 표현식을 찾고 텍스트가 첫 번째 항목에서 발견되면이를 매개 변수로 확장하려고 시도합니다. 이것을 산술 확장이라고하며에 man bash있습니다.

RESERVED WORDS
       Reserved words are words that have a special meaning to the shell.  
       The following words are recognized as reserved 
       
       [[ ]]

[[ expression ]]
       Return  a  status  of 0 or 1 depending on the evaluation of 
       the conditional expression expression.  Expressions are 
       composed of the primaries described below under CONDITIONAL 
       EXPRESSIONS.  Word splitting and pathname expansion are not 
       performed on the words between the  [[  and  ]];  tilde 
       expansion, parameter and variable expansion, >>>_arithmetic 
       expansion_<<<, command substitution, process substitution, and 
       quote removal are performed.  

Arithmetic Expansion
       
       The evaluation is performed according to the rules listed below 
       under ARITHMETIC EVALUATION.

ARITHMETIC EVALUATION
       
       Within an expression, shell variables may also be referenced 
       by name without using the parameter expansion syntax.

예를 들어 :

[[ hdjakshdka -eq fkshdfwuefy ]]

항상 참을 반환합니다

그러나 이것은 오류를 반환합니다

$ [[ 1235hsdkjfh -eq 81749hfjsdkhf ]]
-bash: [[: 1235hsdkjfh: value too great for base (error token is "1235hsdkjfh")

재귀도 가능합니다.

$ VALUE=VALUE ; [[ VALUE -eq 12 ]]
-bash: [[: VALUE: expression recursion level exceeded (error token is "VALUE")

예약어가 산술 평가를 의미하는 이유는 무엇입니까? 어디에서나 문서를 찾을 수 없습니다
Mikel

아 여기 있어요 gnu.org/software/bash/manual/…
Mikel

나는 man bash그것을 명확하게하기 위해 내 대답에 인용을 포함시켰다 .
rush

@Mikel 이것은 [[예약어라는 사실이 아니라, 그 안에 포함 된 [[ … ]]것은 일반적인 명령 구문이 아니라 조건식 이기 때문 입니다. 조건식에서 산술 연산자와 같은 인수 -eq는 산술 평가를받습니다.
Gilles 'SO- 악마 그만해'

예. 나는 첫 번째 문장이 그 아이디어를 제공한다고 말하고 있었다. 그것은 오해의 소지가있다
Mikel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.