Error "operador unario esperado" en Bash si la condición

225

He estado tratando de descubrir qué hay de malo en esto, pero no puedo resolverlo ...

Esta es la parte que parece estar recibiendo un error.

elif [ $operation = "man" ]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [ -z $aug1 ]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi

Me sale este error:

calc_1.2: line 75: [: =: unary operator expected
Jordanss10
fuente
44
Creo que su ifdeclaración en la línea 75 necesita a fi.
Steve
77
En caso de duda, cite los vars.
koola
99
@koola, 'siempre' cita vars.
CousinCocaine

Respuestas:

480

Si sabe que siempre va a usar bash, es mucho más fácil usar siempre el comando compuesto condicional de doble paréntesis [[ ... ]], en lugar de la versión de paréntesis único compatible con Posix [ ... ]. Dentro de un [[ ... ]]compuesto, la división de palabras y la expansión del nombre de ruta no se aplican a las palabras, por lo que puede confiar en

if [[ $aug1 == "and" ]];

para comparar el valor de $aug1con la cadena and.

Si usa [ ... ], siempre necesita recordar dos comillas como esta:

if [ "$aug1" = "and" ];

Si no cita la expansión de la variable y la variable está indefinida o vacía, desaparece de la escena del crimen, dejando solo

if [ = "and" ]; 

que no es una sintaxis válida (También fallaría con un mensaje de error diferente si se $aug1incluyen espacios en blanco o metacaracteres de shell).

El [[operador moderno tiene muchas otras características interesantes, incluida la coincidencia de expresiones regulares.

rici
fuente
99
"moderno"? ¿No [[ siempre ha estado en bash? Ha estado en Korn Shell por más de veinte años, y es anterior a la fiesta. (Sé lo que quieres decir sin embargo)
cdarke
31

Me tomó un tiempo encontrar esto, pero tenga en cuenta que si tiene un error de espaciado, también obtendrá el mismo error:

[: =: unary operator expected

Correcto:

if [ "$APP_ENV" = "staging" ]

vs

if ["$APP_ENV" = "staging" ]

Como siempre, la configuración de la -xvariable de depuración ayuda a encontrar estos:

set -x
Juha Vehnia
fuente
Alguien me legó este error en un script de compilación. Me ahorró algo de tiempo, gracias!
Kyle
8

Intente asignar un valor a $aug1antes de usarlo en las if[]declaraciones; el mensaje de error desaparecerá luego.

Yilee
fuente
0

tú dices ... :

elif [$ operación = "hombre"]; entonces si [$ aug1 = "add"]; luego # <- Línea 75 echo "Página de manual para: agregar" echo "" echo "Sintaxis: agregar [número 1] [número 2]" echo "" echo "Descripción:" echo "Agregar dos números diferentes juntos". echo "" echo "Información:" echo "Agregado en v1.0" echo "" elif [-z $ aug1]; luego echo "Especifique un comando para leer la página del manual". else echo "No hay página de manual para ese comando". fi

creo que es solo el espacio ... haz esto:

elif [$operation = "man"]; then
    if [ $aug1 = "add" ]; then         # <- Line 75
    echo "Man Page for: add"
    echo ""
    echo "Syntax: add [number 1] [number 2]"
    echo ""
    echo "Description:"
    echo "Add two different numbers together."
    echo ""
    echo "Info:"
    echo "Added in v1.0"
    echo ""
elif [-z $aug1]; then
    echo "Please specify a command to read the man page."
else
    echo "There is no manual page for that command."
fi
Renan Moura
fuente
-11

También puede establecer un valor predeterminado para la variable, por lo que no necesita usar dos "[", lo que equivale a dos procesos ("[" es en realidad un programa) en lugar de uno.

Sigue esta sintaxis: $ {VARIABLE: -default}.

Todo debe pensarse de tal manera que este valor "predeterminado" sea algo distinto de un valor / contenido "válido".

Si eso no es posible por alguna razón, probablemente deba agregar un paso como verificar si hay algún valor, en la línea de "if [-z $ VARIABLE]; luego repita" la variable debe completarse "" o " if [! -z $ VARIABLE]; entonces #todo está bien, continúe con el resto del script ".

el guesto
fuente
3
[[no está generando dos procesos, es un shell incorporado (y también [es un Bash incorporado). [[es diferente de [ [, que trata el segundo [como una cadena
user123444555621