Los operandos de las comparaciones numéricas -eq
, -gt
, -lt
, -ge
, -le
y-ne
se toman como expresiones aritméticas. Con alguna limitación, todavía necesitan ser palabras de shell único.
El comportamiento de los nombres de variables en la expresión aritmética se describe en Shell Arithmetic :
Las variables de shell están permitidas como operandos; La expansión de parámetros se realiza antes de evaluar la expresión. Dentro de una expresión, las variables de shell también se pueden referenciar por nombre sin utilizar la sintaxis de expansión de parámetros. Una variable de shell que es nula o sin definir se evalúa a 0 cuando se hace referencia por nombre sin utilizar la sintaxis de expansión de parámetros.
y también:
El valor de una variable se evalúa como una expresión aritmética cuando se hace referencia a ella.
Pero en realidad no puedo encontrar la parte de la documentación donde se dice que las comparaciones numéricas toman expresiones aritméticas. No se describe en Construcciones condicionales [[
, ni se describe en Expresiones condicionales bash .
Pero, por experimento, parece funcionar como se dijo anteriormente.
Entonces, cosas como esta funcionan:
a=6
[[ a -eq 6 ]] && echo y
[[ 1+2+3 -eq 6 ]] && echo y
[[ "1 + 2 + 3" -eq 6 ]] && echo y
esto también (se evalúa el valor de la variable):
b='1 + 2 + 3'
[[ b -eq 6 ]] && echo y
Pero esto no; no es una sola palabra de shell cuando [[ .. ]]
se analiza, por lo que hay un error de sintaxis en el condicional:
[[ 1 + 2 + 3 -eq 6 ]] && echo y
En otros contextos aritméticos, no es necesario que la expresión no tenga espacios en blanco. Esto se imprime 999
, ya que los corchetes delimitan inequívocamente la expresión aritmética en el índice:
a[6]=999; echo ${a[1 + 2 + 3]}
Por otro lado, la =
comparación es una coincidencia de patrones y no implica aritmética, ni la expansión automática de variables realizada en un contexto aritmético (Construcciones condicionales):
Cuando se utilizan los operadores ==
y !=
, la cadena a la derecha del operador se considera un patrón y coincide de acuerdo con las reglas que se describen a continuación en Coincidencia de patrones, como si la opción de shell extglob estuviera habilitada. El =
operador es idéntico a ==
.
Entonces esto es falso ya que las cadenas son obviamente diferentes:
[[ "1 + 2 + 3" = 6 ]]
como es esto, a pesar de que los valores numéricos son los mismos:
[[ 6 = 06 ]]
y aquí, también, las cadenas ( x
y 6
) se comparan, son diferentes:
x=6
[[ x = 6 ]]
Sin embargo, esto expandiría la variable, así que esto es cierto:
x=6
[[ $x = 6 ]]
x=1
sigue[[ x -gt 2]]
?