Dlaczego interpretacja zmiennych bez $ działa w wyrażeniach?


15
#!/bin/bash

VALUE=10

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

Ku mojemu zdziwieniu wynik ten brzmi „Tak”. Spodziewałbym się tego [[ $VALUE -eq 10 ]]. Przejrzałem CONDITIONAL EXPRESSIONSsekcję man bash, ale nie znalazłem niczego, co mogłoby wyjaśnić to zachowanie.

Odpowiedzi:


11

[[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")

Dlaczego bycie zarezerwowanym słowem oznacza, że ​​jest to ocena arytmetyczna? Nigdzie nie mogę tego znaleźć
Mikel


Podałem cytat od man bashdo mojej odpowiedzi, aby było to jasne.
pędzi

@Mikel To nie jest bezpośrednio fakt, że [[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 -eqte, podlegają ocenie arytmetycznej.
Gilles „SO- przestań być zły”

Tak. Mówiłem, że pierwsze zdanie zawiera ten pomysł, który wprowadza w błąd
Mikel
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.