检查while循环中调用的程序的退出代码

Mic*_*bus 6 bash shell

我想在bash中编写一个循环,它执行直到某个命令停止失败(返回非零退出代码),如下所示:

while ! my_command; do
    # do something
done
Run Code Online (Sandbox Code Playgroud)

但是在这个循环中我需要检查my_command返回的退出代码,所以我尝试了这个:

while ! my_command; do
    if [ $? -eq 5 ]; then
        echo "Error was 5"
    else
        echo "Error was not 5"
    fi
    # potentially, other code follows...
done
Run Code Online (Sandbox Code Playgroud)

但随后特殊变量?变为0循环体内.明显的解决方案是:

while true; do
    my_command
    EC=$?
    if [ $EC -eq 0 ]; then
        break
    fi
    some_code_dependent_on_exit_code $EC
done
Run Code Online (Sandbox Code Playgroud)

如何检查my_command循环体内的(在循环头中调用)的退出代码,而不使用while true具有中断条件的循环重写此示例,如上所示?

che*_*ner 16

除了众所周知的while循环之外,POSIX还提供了一个until循环,消除了否定退出状态的需要my_command.

# To demonstrate
my_command () { read number; return $number; }

until my_command; do
    if [ $? -eq 5 ]; then
        echo "Error was 5"
    else
        echo "Error was not 5"
    fi
    # potentially, other code follows...
done
Run Code Online (Sandbox Code Playgroud)


F. *_*uri 5

如果true命令损害了您的敏感性,您可以编写:

while my_command ; ret=$? ; [ $ret -ne 0 ];do
    echo do something with $ret
  done
Run Code Online (Sandbox Code Playgroud)

这可以简化:

while my_command ; ((ret=$?)) ;do
    echo do something with $ret
  done
Run Code Online (Sandbox Code Playgroud)

但是,如果您不需要ResultCode,则可以简单地:

while my_command ; [ $? -ne 0 ];do
    echo Loop on my_command
  done
Run Code Online (Sandbox Code Playgroud)

要么

while my_command ; (($?)) ;do
    echo Loop on my_command
  done
Run Code Online (Sandbox Code Playgroud)

但是从那里开始,您最until好像chepner建议的那样使用