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

Resuelto Jordanss10 asked hace 12 años • 6 respuestas

Este script recibe 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

Recibo este error:

calc_1.2: line 75: [: =: unary operator expected
Jordanss10 avatar Nov 29 '12 09:11 Jordanss10
Aceptado

Si sabe que siempre va a usar Bash, es mucho más fácil usar siempre el comando compuesto condicional de doble corchete [[ ... ]], en lugar de la versión de corchete único compatible con POSIX [ ... ]. Dentro de un [[ ... ]]compuesto, la división de palabras y la expansión de nombres 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 debe recordar poner comillas dobles en las variables como esta:

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

Si no cita la expansión de la variable y la variable no está definida o está 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 $aug1incluye espacios en blanco o metacaracteres de shell).

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

rici avatar Nov 29 '2012 03:11 rici

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, configurar -xla variable de depuración ayuda a encontrar estos:

set -x
Juha Vehnia avatar Sep 21 '2017 20:09 Juha Vehnia

Intente asignar un valor $aug1antes de usarlo en if[]declaraciones; el mensaje de error desaparecerá después.

yilee avatar Sep 25 '2015 12:09 yilee

Asegúrese de que al comparar una variable como $operación mediante comparación de cadenas no deje la posibilidad de que $operación devuelva una cadena vacía si utiliza el enfoque POSIX (corchete único).

Tanto [ $operación == "man"] como [ "" == "man" ] devuelven el mismo error: [: ==: se espera un operador unario

Además, no debe utilizar el operador = a menos que coloque un paréntesis doble, como se indicó anteriormente.

Referencia: https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

eco avatar Jul 05 '2022 23:07 eco