4

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

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


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

它们是等价的吗?如果没有,如果我想把它写在一行中,我该怎么办?

4

1 回答 1

10

它们很接近,但不一样。首先,即使由于某种原因失败,if也会执行;链式表达式不会。此外,链式版本缺少.exit 1echoelse 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"
$ 

虽然两者都printfprint

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

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

于 2012-06-29T03:53:25.360 回答