Odpowiedzi:
[[
jest zarezerwowanym słowem bash, dlatego stosowane są specjalne reguły interpretacji, takie jak interpretacja arytmetyczna, a nie jak w przypadku [
. Używany jest również arytmetyczny operator binarny -eq
. Dlatego powłoka szuka wyrażenia liczb całkowitych i jeśli tekst zostanie znaleziony przy pierwszym elemencie, spróbuje go rozwinąć jako parametr. Nazywa się to rozszerzeniem arytmetycznym i występuje w 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.
Na przykład:
[[ hdjakshdka -eq fkshdfwuefy ]]
wróci zawsze prawda
Ale ten zwróci błąd
$ [[ 1235hsdkjfh -eq 81749hfjsdkhf ]]
-bash: [[: 1235hsdkjfh: value too great for base (error token is "1235hsdkjfh")
Dostępna jest również rekursja:
$ VALUE=VALUE ; [[ VALUE -eq 12 ]]
-bash: [[: VALUE: expression recursion level exceeded (error token is "VALUE")
man bash
do mojej odpowiedzi, aby było to jasne.
[[
jest to słowo zastrzeżone, ale ponieważ to, co jest w środku, nie [[ … ]]
jest zwykłą składnią poleceń, ale wyrażeniem warunkowym. W wyrażeniu warunkowym argumenty dla operatorów arytmetycznych, takich jak -eq
te, podlegają ocenie arytmetycznej.