我正在编写一个 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 是否是0
或1
-中的任何位置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 "$?"
也会起作用。