¿Puedes poner una declaración if dentro de un bucle hasta?

¿Puedes poner una declaración if dentro de un bucle hasta?

Tenemos que crear un script con un untilbucle 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 readse lee en variable number. El untilbucle se repite hasta que $numberes igual a 50.

La prueba dentro del bucle es innecesaria, ya que untilsolo entra cuando el número es -ne(no igual a) 50.

El principal problema que tenías era que readdentro del bucle debías actualizar la misma variable ( number) que untilcomprueba la construcción.

El espaciado también es importante, porque la palabra (rodeada por espacios en blanco) que sigue ifes el nombre de un comando. [$numberevalú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 ifcomando 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 whilese 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 theny elseesté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 doy 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 untilbucle es:

until
  condition-command-list
do
  action-command-list
done

Puede condition-command-listhaber 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 || exitparte 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).

información relacionada