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

Vit*_*ita 2 shell-script

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

\n
  qSHOWROOTS; if [ $? -eq 0 ]; then\n    ncxy 0 "$vpos_l"; prin\xe2\x80\xa6\n  elif [ $? -eq 1 ]; then\n    ncxy 0 "$vpos_l"; prin\xe2\x80\xa6\n  elif [ $? -eq 3 ]; then\n    ncxy 0 "$vpos_l"; prin\xe2\x80\xa6\n  fi\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

谢谢!

\n

Sté*_*las 13

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

\n
if [ $? -eq 0 ]; then\n    ncxy 0 "$vpos_l"; prin\xe2\x80\xa6\n  elif [ $? -eq 1 ]\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

在此,需要case声明一下:

\n
qSHOWROOTS\ncase $? in\n  (1) something;;\n  (2) something else;;\n  ...\n  (*) anything else\nesac\n
Run Code Online (Sandbox Code Playgroud)\n

其中$?仅扩展一次。

\n

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

\n
qSHOWROOTS; ret=$?\nif [ "$ret" -eq 1 ]; then\n  something\nelif [ "$ret" -eq 2 ]; then\n  something else\n...\nelse\n  anything else\nfi\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
cmd\nif [ $? -eq 0 ]\n
Run Code Online (Sandbox Code Playgroud)\n

在风格的基础上。

\n

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

\n

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

\n

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

\n