我正在编写一个 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\nRun Code Online (Sandbox Code Playgroud)\nqSHOWROOTS应该只运行一次,非零退出*代码虽然不错,所以我认为像上面所示的那样编写它会更合适,但shellcheck完全恐慌告诉我我应该只这样做if cmd;,但是会限制我检查 exit 是否是0或1-中的任何位置255,对吗?我可以忽略它还是应该找到其他方法来做到这一点?
谢谢!
\nSté*_*las 13
$?扩展为最后一个命令的退出状态,因此:
if [ $? -eq 0 ]; then\n ncxy 0 "$vpos_l"; prin\xe2\x80\xa6\n elif [ $? -eq 1 ]\nRun Code Online (Sandbox Code Playgroud)\n运行第二个[命令时(假设第一个命令[失败),您只需检查第一个命令的退出状态[,该状态将为 1。
在此,需要case声明一下:
qSHOWROOTS\ncase $? in\n (1) something;;\n (2) something else;;\n ...\n (*) anything else\nesac\nRun Code Online (Sandbox Code Playgroud)\n其中$?仅扩展一次。
如果必须使用if语句,则需要将退出状态存储qSHOWROOTS在单独的变量中:
qSHOWROOTS; ret=$?\nif [ "$ret" -eq 1 ]; then\n something\nelif [ "$ret" -eq 2 ]; then\n something else\n...\nelse\n anything else\nfi\nRun Code Online (Sandbox Code Playgroud)\nshellcheck 反对[ $? -eq 0 ]您有时会在以下内容中看到的内容:
cmd\nif [ $? -eq 0 ]\nRun Code Online (Sandbox Code Playgroud)\n在风格的基础上。
\n这正在运行该[命令,因此如果前一个命令返回 true ,它就会返回 true 并检查是否[成功,而不是直接检查是否成功cmd,这有点愚蠢。你可以写:if cmd; then...。
当前版本的 shellcheck 不会报告缺少的引号,$?即使这是糟糕的编码实践和错误,因为该代码只能在以下上下文中正常工作:$IFS不包含数字的上下文中正常工作。
它应该是[ "$?" -eq 0 ]为了防止 split+glob,因为我们在命令 ( [) 的参数中处于列表上下文中。在 中case $?,我们不在列表上下文中,因此引号不是必需的,但不会造成损害。case "$?"也会起作用。
| 归档时间: |
|
| 查看次数: |
1679 次 |
| 最近记录: |