我曾经这样编写脚本:
some_command
while [ $? -ne 0 ] ; do
sleep 1
some_command
done
我总是因为必须写some_command
两遍而感到烦恼。我可以以某种方式将其放入循环测试部分吗?
答案1
您可以用作some_command
您的测试条件。
while ! some_command; do sleep 1; done
只要some_command
退出时出现错误,该条件就保持为真。
或者如果您想进行额外的检查,可以使用更详细的方法:
while ! some_command
do
# add more if desired
sleep 1
done
答案2
这就是until
循环的用途:
until some_command
do sleep 1
done
它是循环的逻辑否定while
。
这规格说:
循环until
这
until
应连续执行一个复合列表只要另一个复合列表具有非零退出状态。直到循环的格式如下:
直到compound-list-1 执行复合列表 2 完毕
- 这化合物列表-1应被执行,并且如果它的退出状态为零,则
until
命令完成。否则,化合物列表-2将被执行,并且该过程重复。
答案3
你可以这样做:
false
while [ $? -ne 0 ] ; do
sleep 1
some_command
done
这有一个缺点,但它总是先休眠一秒
如果您希望能够使用多个命令中的任何一个以 0 退出,您可以执行以下操作:
while true; do
if [ some_command ] ; then break ; fi
if [ some_other_command ] ; then break ; fi
sleep 1
done
这当然也适用于some_command
答案4
也不while ! ...
适用until ...
于 POSIX.1-2001 之前冻结其 shell 环境的系统。然而,确实如此。
while :; do
if some command; then
break
fi
sleep 1
done
如果您不需要完全的可移植性,为什么还要编写 shell 脚本呢? Perl 是更多的可能比 Bash 更可用。
sleep 1 while 0 != system qw(some command);
(如上所述,sleep
仅当命令失败时才执行。)