2011-11-23 80 views
15

好吧,实际上这是脚本的样子: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!" 

我想改变的是这一行:

while [ $guess != 5 ]; do 

为了这样的事情:

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

在Java中,我知道“和”是“& &”,但似乎并没有工作ħ ERE。我是用正确的方式来使用while循环吗?

编辑:更新的问题,使其在搜索更加有用..

+0

JFYI代码不正确:应该有'读guess',不'$读guess'。 –

+0

感谢您发现错字:) – Smitty

回答

16

[]运营商在bash是到test一个电话,这是在man test记录语法糖。 “或”由缀-o表达,但你需要一个“和”:

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

是的,我的错误“和”是我应该使用的。这可以解释为什么“-o”在我早些时候尝试时不起作用;我只是认为它只适用于if语句,因为它给了我一个错误。非常感谢您的及时回复! – Smitty

+0

注意:这不是POSIX,因此不便携。 –

30

有达到你想要的2分正确的和便携式的方式。
好老shell语法:

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

而且bash语法(如指定):

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

感谢您抽出时间让我知道,我注意到现在我没有将这两个陈述归为一类,这就是为什么它不起作用。 – Smitty

1

的便携和可靠的方法是使用case语句。如果你不习惯它,可能只需要围绕语法来考虑一下。

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 

我以前while true,但你实际上可以直接使用case声明那里。尽管如此,阅读和维护会变得多毛。

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

感谢您花时间回答!当我在我的* nix上时,我会看看这个,但接下来:) – Smitty