Perché l'espansione variabile senza $ funziona nelle espressioni?


15
#!/bin/bash

VALUE=10

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

Con mia sorpresa, questo produce "Sì". Mi sarei aspettato che lo richiedesse [[ $VALUE -eq 10 ]]. Ho scannerizzato la CONDITIONAL EXPRESSIONSsezione di man bash, ma non ho trovato nulla per spiegare questo comportamento.

Risposte:


11

[[è una parola riservata bash, quindi vengono applicate regole di espansione speciali come l'espansione aritmetica, non come nel caso di [. Viene -equtilizzato anche un operatore binario aritmetico . Pertanto la shell cerca un'espressione intera e se viene trovato del testo nel primo elemento, tenta di espanderlo come parametro. Si chiama espansione aritmetica ed è presente in 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.

Quindi per esempio:

[[ hdjakshdka -eq fkshdfwuefy ]]

tornerà sempre vero

Ma questo restituirà un errore

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

Inoltre è disponibile la ricorsione:

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

Perché essere una parola riservata significa fare una valutazione aritmetica? Non lo trovo documentato da nessuna parte
Mikel,


Ho incluso la citazione dalla man bashmia risposta per chiarire.
corsa

@Mikel Non è direttamente il fatto che [[sia una parola riservata, ma perché ciò che è dentro [[ … ]]non è una sintassi di comando ordinaria, ma un'espressione condizionale. In un'espressione condizionale, gli argomenti agli operatori aritmetici come quelli -eqsono soggetti a valutazione aritmetica.
Gilles 'SO- smetti di essere malvagio'

Sì. Stavo dicendo che la prima frase dà quell'idea, che è fuorviante
Mikel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.