El [] operador en bash es azúcar sintáctico para una llamada a test , que está documentado en man test . "o" se expresa mediante un infijo -o , pero necesita un "y":
while [ $guess != 5 -a $guess != 10 ]; do
Hay 2 formas correctas y portátiles de lograr lo que quieres.
Buen viejo shell sintaxis:
while [ "$guess" != 5 ] && [ "$guess" != 10 ]; do
Y bash sintaxis (como usted especifique):
while [[ "$guess" != 5 && "$guess" != 10 ]]; do
La forma portátil y robusta es usar un case declaración en su lugar. Si no está acostumbrado, es posible que necesite algunas miradas 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
Usé while true pero de hecho podrías usar el case declaración allí directamente. Sin embargo, se vuelve difícil de leer y mantener.
while case $guess in 5 | 10) false;; *) true;; esac; do ...