我刚开始学习bash,而我正在阅读the $?
variable。根据我的理解,$?
被分配给最后执行的命令的退出状态。
例如
$ false; echo $?
将产生1,
$ false; :; echo $?
将产生0
当我将这些与if / for块结合使用时,事情会变得复杂一些。手册页显示:
for
NAME [in
WORDS ...];
do
COMMANDS;
done
为列表中的每个成员执行命令。
for
循环为a中的每个成员执行一系列命令 物品清单。如果in WORDS ...;
不存在,则in "$@"
为。{1}} 假定。对于 WORDS 中的每个元素, NAME 设置为该元素,并且 执行 COMMANDS 。退出状态:
返回最后执行的命令的状态。
这意味着:
$ false; for i in 1 2 3; do false; done; echo $?
自上次执行的命令为false后,将产生1。但
$ false; for i in; do false; done; echo $?
或
$ false; if false; then :; fi; echo $?
尽管false是最后执行的命令,但是会产生0。
我的猜测是输入for / if块时$?
变量设置为0。我错过了什么吗?
答案 0 :(得分:4)
if
list ;then
列表; [elif
列表;then
列表; ] ... [else
列表; ]fi
执行
if
list
。如果退出状态为零,则会执行then
list
。否则,每个elif
list
都会执行 如果退出状态为零,则执行相应的then
list
并完成命令。否则,执行else
list
(如果存在)。 退出状态 (整个if ... fi
阻止) 是最后一个命令的退出状态 (在{已执行{1}},then
或elif
阻止 ,如果未经过条件测试,则为零。
答案 1 :(得分:3)
是的,在if ..;
,for ..;
或while ..;
语句后,退出状态重置为0.
要明确这并不意味着在fi;
或done;
之后,因为退出状态是最后一个命令退出状态。
编辑:if
/ elif
和then
之间的命令不影响复合语句的退出状态,而最新命令在then
/ else
之间执行, elif
/ fi
设置复合语句的退出状态。
;退出状态将是return
返回的值或最后一个命令的退出状态。
选项set -e
,set -o errexit
;在具有<> 0退出状态的命令之后,shell退出,除非后跟||
或if ..;
语句。
退出状态,可以使用逻辑运算符&&
,||
:
# to fail fast the process can't continue
simple_command || {
echo "failed .."
exit 1
}
错误处理类似于异常,要问的问题是,在命令失败后进程可以继续进行还是如何继续?
在管道命令中,退出状态是最后一个命令的退出状态,除了set -o pipefail
:退出状态将是管道中退出状态&lt;&gt; 0的最新命令的退出状态。< / p>
答案 2 :(得分:1)
命令$ false; for i in; do false; done; echo $?
提供退出状态for loop
。由于它在没有错误的情况下退出for循环,$?
为0。
这是一个类似的问题,可能会有所帮助。
How to get the exit status a loop in bash