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
if
declaración en la línea 75 necesita afi
.Respuestas:
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 enpara comparar el valor de
$aug1
con la cadenaand
.Si usa
[ ... ]
, siempre necesita recordar dos comillas como esta: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
que no es una sintaxis válida (También fallaría con un mensaje de error diferente si se
$aug1
incluyen espacios en blanco o metacaracteres de shell).El
[[
operador moderno tiene muchas otras características interesantes, incluida la coincidencia de expresiones regulares.fuente
Me tomó un tiempo encontrar esto, pero tenga en cuenta que si tiene un error de espaciado, también obtendrá el mismo error:
Correcto:
vs
Como siempre, la configuración de la
-x
variable de depuración ayuda a encontrar estos:fuente
Intente asignar un valor a
$aug1
antes de usarlo en lasif[]
declaraciones; el mensaje de error desaparecerá luego.fuente
tú dices ... :
creo que es solo el espacio ... haz esto:
fuente
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 ".
fuente
[[
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