【发布时间】:2012-06-29 03:32:08
【问题描述】:
在ksh shell中,我想在运行命令后检查返回值,我写了两种样式:
if [ $? -ne 0 ] ; then
echo "failed!"
exit 1
else
exit 0
fi
[ $? -ne 0 ] && echo "failed!" && exit 1
它们是等价的吗?如果不行,我想写成一行怎么办?
【问题讨论】:
在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 习惯更容易。
【讨论】:
print 在 ksh 中优于 echo?
printf(在具有它的ksh 的现代版本中),因为它可以跨shell 移植。