답변:
[[
은 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")
man bash
그것을 명확하게하기 위해 내 대답에 인용을 포함시켰다 .
[[
예약어라는 사실이 아니라, 그 안에 포함 된 [[ … ]]
것은 일반적인 명령 구문이 아니라 조건식 이기 때문 입니다. 조건식에서 산술 연산자와 같은 인수 -eq
는 산술 평가를받습니다.