如何在 shell 中获取测试命令返回码?
Posted
技术标签:
【中文标题】如何在 shell 中获取测试命令返回码?【英文标题】:How to get test command return code in the shell? 【发布时间】:2016-05-03 11:39:09 【问题描述】:有没有更好的方法在一行中从命令中获取返回码。例如:
$ test $(ls -l) ||echo 'ok'
-bash: test: too many arguments
ok
上面的脚本在测试命令中有错误,因为它似乎解析输出“ls - l”而不是返回代码。
我知道使用“if”语法可以正常工作,但需要多于一行。
ls -l
if [ $? -eq 0 ];then
echo 'ok'
fi
【问题讨论】:
很不清楚你在问什么。请注意edit 并说明您面临的确切问题是什么? 您误解了test
命令。无需使用它来简单地检查返回码。第二段代码的单行代码是ls -l && echo 'ok'
。
【参考方案1】:
您可以使用&&
和||
使这些东西成为一条线。例如,在下面:
ls -l && echo ok
只有在&&
(ls -l
) 之前的命令返回0
时,echo ok
才会运行。
另一方面,在以下方面:
ls -l || echo 'not ok'
echo 'not ok'
将仅在||
之前的命令返回非零时运行。
另外,您可以使用;
使您的if..else
阻止单行:
if ls -l;then echo ok;else echo 'not ok';fi
但这可能会使您的代码难以阅读,因此不推荐。
【讨论】:
【参考方案2】:if
语句正在捕获命令的返回值,例如 ls
:
if ls -l; then
echo 'ok'
fi
【讨论】:
【参考方案3】:这里的另一个问题是如何在下面的示例中工作。
ls -l xxx || (echo "file xxx not exist" ; exit 1);echo "OK"
作为示例。如果文件 xxx 不存在。第二个 echo OK 即使之前退出 1 仍然有效。
如果文件 xxx 不存在,我希望退出返回码 1。
【讨论】:
【参考方案4】:而不是使用
test $(ls -l) ||echo 'ok'
你应该使用
[[ $(ls -l) ]] && echo "ok"
[[ ]]
是测试,如果命令成功返回(返回代码为零)然后它在&&
之后执行命令。
[[ ]]
测试
$( )
执行命令
ls -l
命令运行
&&
测试成功则运行
希望这会有所帮助!
【讨论】:
命令执行$(...)
会检查输出文本,而不是返回码。例如检查这个:[[ $(echo abc && false) ]] && echo ok || echo no
- 它会打印出“ok”
@viraptor,感谢 cmets。上面的答案检查返回值而不是命令的返回文本。您可以通过输入[[ $(ls -l dirDoesNotExist ) ]] && echo "ok" || echo "not ok"
来查看此内容,您将收到“not ok”响应。您包含的命令 [[ $(echo abc && false) ]]
成功执行,因此它按预期返回零返回码。如果您仍然不同意,请告诉我,我们将继续努力。谢谢!
我只想在这里添加一些东西,简写为 if 语句使用 && 和 ||不直接等同于 if , else。如果 && 之后的命令失败,||子句也将运行。示例:[[ true ]] && echo "true";错误的; ||回声“假”
@Martin,你是对的。谢谢你的澄清。
@jgshawkey 这不是它在 dirDoesNotExist 的情况下失败的原因。在这种情况下,错误消息会打印到 stderr,因此没有标准输出,这就是检查失败的原因。可以看到[[ $(ls -l dirDoesNotExist 2>&1 ) ]] && echo "ok" || echo "not ok"
成功了。没有重定向,这相当于[[ "" ]] && echo ...
以上是关于如何在 shell 中获取测试命令返回码?的主要内容,如果未能解决你的问题,请参考以下文章