如果退出代码有多个,是否可以在 Bash if 语句中间接检查退出代码?

如果退出代码有多个,是否可以在 Bash if 语句中间接检查退出代码?

我正在编写一个 Bash 脚本,如下所示:

  qSHOWROOTS; if [ $? -eq 0 ]; then
    ncxy 0 "$vpos_l"; prin…
  elif [ $? -eq 1 ]; then
    ncxy 0 "$vpos_l"; prin…
  elif [ $? -eq 3 ]; then
    ncxy 0 "$vpos_l"; prin…
  fi

qSHOWROOTS应该只运行一次,非零退出*代码虽然不错,所以我认为像上面所示的那样编写它会更合适,但shellcheck完全恐慌告诉我我应该只做if cmd;相反,但这会限制我检查 exit 是否是01-中的任何位置255,对吗?我可以忽略它还是应该找到其他方法来做到这一点?

谢谢!

答案1

$?扩展为最后一个命令的退出状态,因此:

if [ $? -eq 0 ]; then
    ncxy 0 "$vpos_l"; prin…
  elif [ $? -eq 1 ]

运行第二个[命令时(假设第一个命令[失败),您只需检查第一个命令的退出状态,[该状态将为 1。

在此,需要声明一下case

qSHOWROOTS
case $? in
  (1) something;;
  (2) something else;;
  ...
  (*) anything else
esac

其中$?仅扩展一次。

如果必须使用语句if,则需要将退出状态存储qSHOWROOTS在单独的变量中:

qSHOWROOTS; ret=$?
if [ "$ret" -eq 1 ]; then
  something
elif [ "$ret" -eq 2 ]; then
  something else
...
else
  anything else
fi

shellcheck 反对[ $? -eq 0 ]您有时会在以下内容中看到的内容:

cmd
if [ $? -eq 0 ]

风格地面。

这正在运行该[命令,因此如果前一个命令返回 true ,它就会返回 true 并检查是否[成功,而不是直接检查是否成功,cmd这有点愚蠢。你可以写:if cmd; then...。

当前版本的 shellcheck 不会报告缺少的引号,$?尽管这是不好的编码实践和错误,因为该代码只能在$IFS不包含数字的上下文中正常工作。

它应该是[ "$?" -eq 0 ]为了防止 split+glob,因为我们在命令 ( ) 的参数中处于列表上下文中[。在 中case $?,我们不在列表上下文中,因此引号不是必需的,但不会造成损害。case "$?"也会起作用。

相关内容