两种样式的检查在ksh中返回值

时间:2012-06-29 03:32:09

标签: shell ksh

在ksh shell中,我想在运行命令后检查返回值,我写了两种样式:

if [ $? -ne 0 ] ; then
    echo "failed!"
    exit 1
else
    exit 0
fi


[ $? -ne 0 ] && echo "failed!" && exit 1

他们是等同的吗?如果没有,如果我想把它写成一行,我该怎么办?

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,则可以使用printecho的问题在于它没有提供处理变量中奇怪字符串的方法:

$ x=-n
$ echo "$x"
$ 

printfprint同时执行:

$ printf '%s\n' "$x"
-n
$ print - "$x"
-n

同样,这里不是问题,或者你只是打印出一个文字字符串,但我发现完全训练自己摆脱echo习惯更容易。