Bash $?变量分配

时间:2017-06-16 10:28:44

标签: bash exitstatus

我刚开始学习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。我错过了什么吗?

3 个答案:

答案 0 :(得分:4)

根据bash's manual

  

if list ; then 列表; [elif 列表; then 列表; ] ... [else 列表; ] fi

     
    

执行if list 。如果退出状态为零,则会执行then list 。否则,每个elif list 都会执行      如果退出状态为零,则执行相应的then list 并完成命令。否则,执行else list (如果存在)。 退出状态 (整个if ... fi阻止) 是最后一个命令的退出状态 (在{已执行{1}},thenelif阻止 ,如果未经过条件测试,则为零。

  

答案 1 :(得分:3)

是的,在if ..;for ..;while ..;语句后,退出状态重置为0.

要明确这并不意味着在fi;done;之后,因为退出状态是最后一个命令退出状态。

编辑:if / elifthen之间的命令不影响复合语句的退出状态,而最新命令在then / else之间执行, elif / fi设置复合语句的退出状态。

函数调用后

;退出状态将是return返回的值或最后一个命令的退出状态。

选项set -eset -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