我想在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)
如果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建议的那样使用
| 归档时间: |
|
| 查看次数: |
8681 次 |
| 最近记录: |