在ksh shell中,我想在运行命令后检查返回值,我写了两种样式:
if [ $? -ne 0 ] ; then
echo "failed!"
exit 1
else
exit 0
fi
[ $? -ne 0 ] && echo "failed!" && exit 1
他们是等同的吗?如果没有,如果我想把它写成一行,我该怎么办?
答案 0 :(得分:9)
他们很接近,但不一样。首先,即使if
由于某种原因失败,exit 1
也会执行echo
;链式表达不会。此外,链式版本缺少等效的else exit 0
。
更好的等价物是:
[ $? -ne 0 ] && { echo "failed!"; exit 1; } || exit 0
标记为ksh
,因此您可能会发现数字表达式语法更清晰:
(( $? )) && { echo "failed!"; exit 1; } || exit 0
但如果你愿意,你也可以在一行写一个if
:
if (( $? )); then echo "failed!"; exit 1; else exit 0; fi
如果您刚刚在此表达式上方运行以便设置$?
的命令很短,您可能希望直接将其用作if
表达式 - 使用reverse子句,因为退出代码0是的:
if grep -q "pattern" /some/filename; then exit 0; else echo "failed!"; exit 1; fi
对于这个简单的情况并不重要,但总的来说你可能想避免echo
。相反,请使用printf
- 或者如果您不介意仅使用ksh,则可以使用print
。 echo
的问题在于它没有提供处理变量中奇怪字符串的方法:
$ x=-n
$ echo "$x"
$
printf
和print
同时执行:
$ printf '%s\n' "$x"
-n
$ print - "$x"
-n
同样,这里不是问题,或者你只是打印出一个文字字符串,但我发现完全训练自己摆脱echo
习惯更容易。