Shell ksh中两种类型的检查返回值

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由于某种原因失败;链式表达式不会。此外,链接

在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为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移植。