2011-11-23 16 views
15

Dobrze, w zasadzie to, co skrypt wygląda następująco:Używanie "i" w bash 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!" 

Co chcę zmienić jest ta linia:

while [ $guess != 5 ]; do 

Aby coś takiego:

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

W Javie wiem "i" jest "& &", ale to nie wydają się działać h ere. Czy podchodzę do tego w odpowiedni sposób, używając pętli while?

EDIT: zaktualizowane pytanie aby uczynić go bardziej przydatne w wyszukiwaniu ..

+0

Kod JFYI jest niepoprawny: powinno być 'read guess', a nie' read $ guess'. –

+0

Dzięki za zauważenie literówki :) – Smitty

Odpowiedz

16

Operator [] w bash jest cukier syntaktyczny dla wywołania test, która jest udokumentowana w man test. „Lub” wyraża się przez wrostkiem -o, ale trzeba an „oraz”:

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

Tak, mój błąd "i" był tym, którego powinienem używać. To wyjaśni, dlaczego "-o" nie działało, gdy próbowałem go wcześniej; Po prostu myślałem, że ma to zastosowanie tylko w przypadku stwierdzeń, które spowodowały błąd. Dziękuję bardzo za szybką odpowiedź! – Smitty

+0

Uwaga: nie jest to POSIX i nie jest przenośny. –

30

Istnieją 2 poprawne i przenośne sposoby, aby osiągnąć to, co chcesz.
Good old shell składnia:

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

I bash składni (jak to określić):

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

Dzięki za poświęcenie czasu, aby dać mi znać, zauważyłem, że nie przejrzałem dwóch stwierdzeń i dlatego to nie działało. – Smitty

1

Przenośne i solidne sposobem jest użycie case oświadczenie zamiast. Jeśli nie jesteś do tego przyzwyczajony, może to zająć kilka spojrzeń, po prostu owinąć głowę wokół składni.

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 

użyłem while true ale w rzeczywistości można użyć instrukcji case tam bezpośrednio. Mimo to robi się owłosiony, żeby go przeczytać i utrzymać.

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

Dziękujemy za poświęcenie czasu na odpowiedź! Zajrzę do tego, kiedy będę na mojej * nix, ale potem :) – Smitty