Error de "operador unario esperado" en Bash si la condición
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
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 $aug1
con 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 $aug1
incluye espacios en blanco o metacaracteres de shell).
El operador moderno [[
tiene muchas otras características interesantes, incluida la coincidencia de expresiones regulares.
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 -x
la variable de depuración ayuda a encontrar estos:
set -x
Intente asignar un valor $aug1
antes de usarlo en if[]
declaraciones; el mensaje de error desaparecerá después.
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