GNU/Linux >> Linux Esercitazione >  >> Linux

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

#!/bin/bash

VALUE=10

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

Con mia sorpresa, questo emette "Sì". Mi sarei aspettato che richiedesse [[ $VALUE -eq 10 ]] . Ho scansionato le CONDITIONAL EXPRESSIONS sezione di man bash , ma non ho trovato nulla che spieghi questo comportamento.

Risposta accettata:

[[ è bash parola riservata, quindi vengono applicate regole di espansione speciali come l'espansione aritmetica, non come nel caso con [ . Anche l'operatore binario aritmetico -eq viene utilizzato. Pertanto la shell cerca l'espressione intera e se viene trovato del testo al primo elemento cerca 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 ad esempio:

[[ hdjakshdka -eq fkshdfwuefy ]]

restituirà sempre vero

Ma questo restituirà un errore

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

È disponibile anche la ricorsione:

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

Linux
  1. Linux – Perché Setuid non funziona??

  2. Linux:perché Locale Es_mx funziona ma non Es?

  3. Perché una funzione principale senza un'istruzione return restituisce il valore 12?

  4. Perché find -exec mv {} ./target/ + non funziona?

  5. Perché "\d" non funziona nelle espressioni regolari in sed?

Ssh – Come funziona Tcp-keepalive in Ssh?

Perché `esce &` non funziona?

Che cos'è il comando Grep in Linux? Perché viene utilizzato e come funziona?

Perché Tomcat funziona con la porta 8080 ma non con la 80?

La ripetizione automatica non funziona

Perché il bit setuid funziona in modo incoerente?