Shell ksh中两种类型的检查返回值
在ksh shell中,我想在运行命令后检查返回值,我编写了两种样式:Shell ksh中两种类型的检查返回值,shell,ksh,Shell,Ksh,在ksh shell中,我想在运行命令后检查返回值,我编写了两种样式: if [ $? -ne 0 ] ; then echo "failed!" exit 1 else exit 0 fi [ $? -ne 0 ] && echo "failed!" && exit 1 它们相等吗?如果没有,如果我想把它写在一行,我该怎么办?它们很接近,但不一样。首先,if将执行exit 1,即使echo由于某种原因失败;链式表达式不会。此外,链接
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为true:
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
习惯更容易。为什么print
比ksh中的echo
好?我编辑了这个问题的答案。实际上,我建议使用printf
(在现代版本的ksh
中有),因为它可以跨shell移植。