Warum funktioniert die Variablenerweiterung ohne $ in Ausdrücken?

15
#!/bin/bash

VALUE=10

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

Zu meiner Überraschung gibt dies "Ja" aus. Ich hätte erwartet, dass es erforderlich ist [[ $VALUE -eq 10 ]]. Ich habe den CONDITIONAL EXPRESSIONSAbschnitt von gescannt man bash, aber ich habe nichts gefunden, um dieses Verhalten zu erklären.

Heinzi
quelle

Antworten:

11

[[Ist bash reserviertes Wort, so werden spezielle Expansionsregeln wie arithmetische Expansionen angewendet, nicht wie bei [. Es wird auch ein arithmetischer Binäroperator -eqverwendet. Deshalb sucht die Shell nach ganzzahligen Ausdrücken und wenn beim ersten Element Text gefunden wird, versucht sie, ihn als Parameter zu erweitern. Es heißt arithmetische Expansion und ist in vorhanden 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.

Also zum Beispiel:

[[ hdjakshdka -eq fkshdfwuefy ]]

wird immer wahr zurückkehren

Aber dieser wird einen Fehler zurückgeben

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

Auch Rekursion ist möglich:

$ VALUE=VALUE ; [[ VALUE -eq 12 ]]
-bash: [[: VALUE: expression recursion level exceeded (error token is "VALUE")
eilen
quelle
Warum bedeutet ein reserviertes Wort eine arithmetische Auswertung? Ich kann das nirgendwo dokumentieren
Mikel
Ah, hier ist es. gnu.org/software/bash/manual/…
Mikel
Ich habe man bashmeiner Antwort ein Zitat von beigefügt , um dies zu verdeutlichen.
Ansturm
@Mikel Es ist nicht direkt die Tatsache, dass [[es sich um ein reserviertes Wort handelt, sondern weil das, was darin enthalten [[ … ]]ist, keine gewöhnliche Befehlssyntax ist, sondern ein bedingter Ausdruck. In einem bedingten Ausdruck werden die Argumente für arithmetische Operatoren wie z. B. -eqeiner arithmetischen Auswertung unterzogen.
Gilles 'SO- hör auf böse zu sein'
Ja. Ich sagte, der erste Satz gibt diese Idee, die irreführend ist
Mikel