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


13

我以前是这样写脚本的:

some_command
while [ $? -ne 0 ] ; do
    sleep 1
    some_command
done

我不得不写some_command两次总是让我讨厌。我可以以某种方式将其放入循环测试部分吗?

Answers:


20

您可以将其some_command用作测试条件。

while ! some_command; do sleep 1; done

只要some_command错误退出,该条件将保持为真。

如果您要进行其他检查,则可以使用更详细的方法:

while ! some_command
do 
    # add more if desired
    sleep 1
done

这看起来比我的好,尽管它是单线的;-)
Anthon 2014年

不过,如果他需要在失败时执行多个命令,则OP可能希望将其分成几行:)
John WH Smith

没有理由不能在分号处将其换行以使其变为多行。
Mark Stewart

1
...或写while ! some_command; do several; commands; sleep 1; done
ignis 2014年

12

这是until循环的目的:

until some_command
do    sleep 1
done

这是while循环的逻辑否定。

规范说:

until循环

  • 只要另一个复合列表的退出状态为非零,until循环就应连续执行一个复合列表

  • 直到循环的格式如下:

    直到compound-list-1
    做compound-list-2
    做完了
  • 化合物列表-1应被执行,如果它有一个零退出状态,该until命令完成。否则,应执行compound-list-2,然后重复该过程。

4

您可以这样做:

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


5
第二个例子不应该包括[]周围的命令。
nyuszika7h 2014年

2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.