¿Por qué el operador igual a no funciona si no está rodeado de espacios?

Resuelto Andrew-Dufresne asked hace 13 años • 4 respuestas

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?

Andrew-Dufresne avatar Feb 12 '11 16:02 Andrew-Dufresne
Aceptado

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"
CB Bailey avatar Feb 12 '2011 09:02 CB Bailey

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.

William Pursell avatar Feb 13 '2011 12:02 William Pursell

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 var1y var2está vacío).

Jahid avatar Jul 08 '2015 18:07 Jahid