¿Por qué el operador igual a no funciona si no está rodeado de espacios?
Probé el siguiente script:
#!/bin/bash
var1="Test 1"
var2="Test 2"
if [ "$var1"="$var2" ]
then
echo "Equal"
else
echo "Not equal"
fi
Me dio Equal
. Aunque debería haber impresoNot equal
Sólo cuando inserté espacio alrededor =
funcionó según lo previsto:
if [ "$var1" = "$var2" ]
e impresoNot equal
¿Por que es esto entonces? ¿Por qué no es "$var1"="$var2"
lo mismo que "$var1" = "$var2"
?
Además, cuando escribí if [ "$var1"= "$var2" ]
, me dio
line 4: [: Test 1=: unary operator expected
¿Qué significa? ¿Cómo es que espera un operador unario?
test
(o [ expr ]
) es una función incorporada. Como todas las funciones en bash, pasas sus argumentos como palabras separadas por espacios en blanco.
Como dice la página de manual de bash buildins: "Cada operador y operando debe ser un argumento separado".
Así es como funcionan bash y la mayoría de los demás shells de Unix.
La asignación de variables es diferente.
En bash, una asignación de variable tiene la sintaxis: name=[value]
. No puedes poner espacios sin comillas alrededor =
porque bash no interpretaría esto como la tarea que deseas. bash trata la mayoría de las listas de palabras como un comando con parámetros.
P.ej
# call the command or function 'abc' with '=def' as argument
abc =def
# call 'def' with the variable 'abc' set to the empty string
abc= def
# call 'ghi' with 'abc' set to 'def'
abc=def ghi
# set 'abc' to 'def ghi'
abc="def ghi"
Cuando el caparazón lee
si [ "$var1" = "$var2" ]
invoca el comando [ con 4 argumentos. Si [ es un comando interno o externo es irrelevante, pero puede ser útil comprender que puede ser el comando externo /bin/[. El segundo argumento es el literal '=" y el cuarto es ']'. Sin embargo, cuando el shell lee
si [ "$var1"= "$var2" ]
[solo obtiene 3 argumentos: la expansión de $var1 con '=" añadido, la expansión de $var2 y ']'. Cuando obtiene solo 3 argumentos, espera que el último argumento sea ']' y que el primer argumento sea un operador unario.
Para agregar a la explicación existente, "$var1"="$var2"
es solo una cadena única no vacía y, por lo tanto, siempre se evalúa como verdadera en un condicional.
[ "$var1"="$var2" ] && echo true
El comando anterior siempre se imprimirá true
(incluso si var1
y var2
está vacío).