Bash脚本,while循环中的多个条件

时间:2013-03-20 20:59:11

标签: bash shell loops while-loop

我正在尝试使用bash中的一个简单的while循环使用两个条件,但在尝试了各种论坛的许多不同语法之后,我无法停止抛出错误。这就是我所拥有的:

while [ $stats -gt 300 ] -o [ $stats -eq 0 ]

我也尝试过:

while [[ $stats -gt 300 ] || [ $stats -eq 0 ]]

......以及其他几个构造。我希望此循环在$stats is > 300$stats = 0时继续。

3 个答案:

答案 0 :(得分:100)

正确的选项是(按推荐顺序递增):

# Single POSIX test command with -o operator (not recommended anymore).
# Quotes strongly recommended to guard against empty or undefined variables.
while [ "$stats" -gt 300 -o "$stats" -eq 0 ]

# Two POSIX test commands joined in a list with ||.
# Quotes strongly recommended to guard against empty or undefined variables.
while [ "$stats" -gt 300 ] || [ "$stats" -eq 0 ]

# Two bash conditional expressions joined in a list with ||.
while [[ $stats -gt 300 ]] || [[ $stats -eq 0 ]]

# A single bash conditional expression with the || operator.
while [[ $stats -gt 300 || $stats -eq 0 ]]

# Two bash arithmetic expressions joined in a list with ||.
# $ optional, as a string can only be interpreted as a variable
while (( stats > 300 )) || (( stats == 0 ))

# And finally, a single bash arithmetic expression with the || operator.
# $ optional, as a string can only be interpreted as a variable
while (( stats > 300 || stats == 0 ))

一些注意事项:

  1. 引用[[ ... ]]((...))中的参数扩展是可选的;如果未设置变量,-gt-eq将采用值0。

  2. $内使用(( ... ))是可选的,但使用它可以帮助避免无意的错误。如果未设置stats,则(( stats > 300 ))将采用stats == 0,但(( $stats > 300 ))将产生语法错误。

答案 1 :(得分:1)

尝试:

while [ $stats -gt 300 -o $stats -eq 0 ]

[是对test的致电。它不仅仅用于分组,就像其他语言中的括号一样。请查看man [man test以获取更多信息。

答案 2 :(得分:0)

第二种语法外部的额外[]是不必要的,可能会令人困惑。您可以使用它们,但如果必须,则需要在它们之间留出空格。

可替换地:

while [ $stats -gt 300 ] || [ $stats -eq 0 ]