如何运行命令并以更少的字符获取其退出代码?

如何运行命令并以更少的字符获取其退出代码?

我曾经这样编写脚本:

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仅当命令失败时才执行。)

相关内容