#!/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")