2011-11-23 16 views
15

acuerdo, esencialmente, esto es lo que se ve la secuencia de comandos como:El uso de "y" en Bash bucle while

echo -n "Guess my number: " 
read guess 

while [ $guess != 5 ]; do 
echo Your answer is $guess. This is incorrect. Please try again. 
echo -n "What is your guess? " 
read guess 
done 

echo "That's correct! The answer was $guess!" 

Lo que quiero cambiar es esta línea:

while [ $guess != 5 ]; do 

Para algo como esto:

while [ $guess != 5 and $guess != 10 ]; do 

En Java que sé "y" es "& &" pero eso no parece funcionar h antes de. ¿Estoy haciendo esto de la manera correcta usando un ciclo while?

EDIT: pregunta actualizado para que sea más útil en las búsquedas ..

+0

El código de JFYI es incorrecto: debería haber 'read guess', not' read $ guess'. –

+0

Gracias por detectar el error tipográfico :) – Smitty

Respuesta

16

El operador [] en bash es el azúcar sintáctica para una llamada a test, que se documenta en man test. "O" se expresa mediante un infijo -o, pero se necesita una "y":

while [ $guess != 5 -a $guess != 10 ]; do 
+0

sí, mi error "y" fue el que debería estar usando. Eso explicará por qué "-o" no funcionó cuando lo intenté antes; Solo pensé que era aplicable solo a las declaraciones if cuando me dio un error. ¡Muchas gracias por su pronta respuesta! – Smitty

+0

Nota: esto no es POSIX y, por lo tanto, no es portátil. –

30

Hay 2 formas correctas y portátiles para lograr lo que quiere.
El bueno de shell sintaxis:

while [ "$guess" != 5 ] && [ "$guess" != 10 ]; do 

Y bash sintaxis (como se especifica):

while [[ "$guess" != 5 && "$guess" != 10 ]]; do 
+0

Gracias por tomarse el tiempo para informarme, me di cuenta ahora que no estaba entre corchetes de las dos declaraciones y que era por eso que no estaba funcionando. – Smitty

1

La forma portátil y robusto es el uso de una declaración case lugar. Si no está acostumbrado, puede tomar algunas miradas solo para entender la sintaxis.

while true; do 
    case $guess in 5 | 10) break ;; esac 
    echo Your answer is $guess. This is incorrect. Please try again. 
    echo -n "What is your guess? " 
    read guess # not $guess 
done 

que utilizan while true pero podría, de hecho, utilizar la instrucción case allí directamente. Sin embargo, se pone peludo de leer y mantener.

while case $guess in 5 | 10) false;; *) true;; esac; do ... 
+0

¡Gracias por tomarse el tiempo para responder! Voy a echar un vistazo a esto cuando esté en mi * nix pero a continuación :) – Smitty

Cuestiones relacionadas