editar - linux easytag
[: Operador inesperado en la programaciĆ³n del shell (8)
Esta pregunta ya tiene una respuesta aquí:
- Error inesperado del operador [duplicado] 4 respuestas
Mi código:
#!/bin/sh
#filename:choose.sh
read choose
[ "$choose" == "y" -o "$choose" == "Y" ] && echo "Yes" && exit 0
[ "$choose" == "n" -o "$choose" == "N" ] && echo "No" && exit 0
echo "Wrong Input" && exit 0
Pero cuando ejecuto
sh ./choose.sh
terminal me pide que
[: 4: n: :Unexpected operator
[: 5: n: :Unexpected operator
¿Hay algún error en mi script bash? ¡Gracias!
De hecho, el corchete de apertura cuadrado "[" es solo un alias de shell interno para el comando de prueba.
Entonces puedes decir:
test -f "/bin/bash" && echo "This system has a bash shell"
o
[ -f "/bin/bash" ] && echo "This system has a bash shell"
... son equivalentes en sh o bash. Tenga en cuenta el requisito de tener un corchete "]" de cierre en el comando "[", pero aparte de eso "[" es lo mismo que "prueba". "prueba de hombre" es algo bueno de leer.
En su código, reemplace esta línea:
#!/bin/sh
con
#!/bin/bash
Esta debe ser la primera línea de su script e indica qué shell de linux debe usarse. sh no admite los mismos comandos que bash.
No hay ningún error en tu script bash . Pero lo estás ejecutando con sh, que tiene una sintaxis menos extensa;)
Entonces, ejecuta bash ./choose.sh
en bash ./choose.sh
lugar :)
No utilice ninguna palabra clave reservada como el inicio de cualquier nombre de variable: por ejemplo, HOSTNAME fallará ya que HOST {TYPE | NAME} está reservado.
POSIX sh no comprende ==
para la igualdad de cadenas, ya que es un basismo. Use =
lugar.
Las otras personas que dicen que los corchetes no son compatibles con sh son incorrectos, por cierto.
Para ejecutarlo con Bash, use #! / Bin / bash y chmod para que sea ejecutable, luego use
./choose.sh
puedes usar case / esac en lugar de if / else
case "$choose" in
[yY]) echo "Yes" && exit;;
[nN]) echo "No" && exit;;
* ) echo "wrong input" && exit;;
esac
tienes que usar bash en su lugar o reescribir tu script usando sh estándar
sh -c ''test "$choose" = "y" -o "$choose" = "Y"''