#!/bin/bash
VALUE=10
if [[ VALUE -eq 10 ]]
then
echo "Yes"
fi
Para mi sorpresa, esto da como resultado "Sí". Habría esperado que requiriera [[ $VALUE -eq 10 ]]
. He escaneado las CONDITIONAL EXPRESSIONS
sección de man bash
, pero no encontré nada que explicara este comportamiento.
Respuesta aceptada:
[[
es una palabra reservada de bash, por lo tanto, se aplican reglas de expansión especiales, como la expansión aritmética, no como en el caso de [
. También operador binario aritmético -eq
se usa Por lo tanto, Shell busca una expresión entera y si encuentra texto en el primer elemento, intenta expandirlo como parámetro. Se llama expansión aritmética y está presente en 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.
Entonces, por ejemplo:
[[ hdjakshdka -eq fkshdfwuefy ]]
devolverá siempre verdadero
Pero este devolverá un error
$ [[ 1235hsdkjfh -eq 81749hfjsdkhf ]]
-bash: [[: 1235hsdkjfh: value too great for base (error token is "1235hsdkjfh")
También está disponible la recursividad:
$ VALUE=VALUE ; [[ VALUE -eq 12 ]]
-bash: [[: VALUE: expression recursion level exceeded (error token is "VALUE")