
Tenemos que crear un script con un until
bucle para pedirle un número repetidamente al usuario. - Si el número no es 50, muestra el mensaje “Número incorrecto; intentar otra vez." - pide otro número. - Si el número es 50, muestra el mensaje "¡Lo tienes!" y pare.
Esto es lo que tengo hasta ahora:
echo -n "please choose a number: "
read number
until [$number -eq 50];
do
if [$number !=50]
then
echo "Wrong number; try again"
read wrong
else
echo -n "Please choose a number: "
read newnum
fi
done
No estoy seguro de cómo repetir la instrucción "Elija un número". Siempre termino con el error:
syntax error near unexpected token 'fi'
He estado buscando en línea, pero no hay ejemplos claros de bucles de entrada y salida HASTA
Respuesta1
echo -n "please choose a number: "
read number
until [ $number -eq 50 ]
do
# if [ $number -ne 50 ]
# then
echo "Wrong number; try again"
read number
# fi
done
echo You got it\!
El primero read
se lee en variable number
. El until
bucle se repite hasta que $number
es igual a 50.
La prueba dentro del bucle es innecesaria, ya que until
solo entra cuando el número es -ne
(no igual a) 50.
El principal problema que tenías era que read
dentro del bucle debías actualizar la misma variable ( number
) que until
comprueba la construcción.
El espaciado también es importante, porque la palabra (rodeada por espacios en blanco) que sigue if
es el nombre de un comando. [$number
evalúa lo que se ingresó, pero con el prefijo '[', que probablemente no sea el nombre de un comando existente. Por ejemplo, si la primera suposición fue 42
, el if
comando intentaría ejecutar el comando [42
, provocando un error como[42: not found
.
Además, la comparación de números se realiza con -eq
, -lt
, -ge
, -gt
, -ge
, -ne
.
=
y =!
son para cuerdas.
Respuesta2
En la otra respuesta, recibió algunos consejos más generales sobre su programa, por lo que le señalaré el error real, que está en línea con elif
if [$number !=50]
Debería ser:
if [ $number -ne 50 ]
Cambié tres cosas aquí.
- Lo reemplacé
!=
con-ne
. El primero no es válido. - Agregué un espacio entre
[
y$number
. (Compruebe corrigiendo el primer paso qué sucede si no lo hace).
Por supuesto, obtienes un programa extraño con un comportamiento inesperado, pero se ejecutará :)
Respuesta3
Yo lo haría así:
#!/usr/bin/env bash
while :; do
read -p "Please choose a number: " number
[ "$number" -eq 50 ] 2>/dev/null
case $? in
0) break ;;
1) echo "Wrong number; try again." ;;
2) echo "Not a valid number; try again." ;;
esac
done
echo "You got it!"
Donde while
se puede reemplazar con until
, si se desea. Pero tengo la sensación de que el profesornoEstaría encantado si musicstrings enviara este programa. :)
Respuesta4
Suerror de sintaxis cerca del token inesperado 'fi'no se puede explicar con el código que publicó a menos que ambos then
y else
estén seguidos de caracteres invisibles como un carácter CR (como cuando los archivos provienen del sistema operativo Microsoft donde el delimitador de línea es CRLF en lugar de solo LF. Pero si fuera un archivo formateado en DOS, yo Esperaríamos otros mensajes de error debido al CR después de do
y done
.
Editar: mirando el historial de revisión de su pregunta, el error parece corresponder a un error en unversión anterior de su script.
Tiene varios errores con [
la sintaxis de su comando, variables sin comillas, como ya se señaló, pero me gustaría agregar que la sintaxis de un until
bucle es:
until
condition-command-list
do
action-command-list
done
Puede condition-command-list
haber cualquier número de comandos como action-command-list
, por lo que puedes hacer
until
printf 'please choose a number: '
read number || [ -n "$number" ] || exit
[ "$number" -eq 50 ]
do
echo >&2 'Wrong number; try again'
done
La || exit
parte es salir del script al EOF (de lo contrario, se repetiría para siempre si la salida estándar del script se cerrara como cuando se ejecutó echo 49 | your-script
).