在 ksh shell 中,我想在运行命令后检查返回值,我写了两种样式:
if [ $? -ne 0 ] ; then
echo "failed!"
exit 1
else
exit 0
fi
[ $? -ne 0 ] && echo "failed!" && exit 1
它们是等价的吗?如果没有,如果我想把它写在一行中,我该怎么办?
它们很接近,但不一样。首先,即使由于某种原因失败,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
表达式 - 使用反向子句,因为退出代码 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
完全训练自己摆脱这种习惯更容易。