4
检查返回值在ksh的壳,我想运行一个命令后,检查返回值,我已经写了两个款式:两种风格在KSH
if [ $? -ne 0 ] ; then
echo "failed!"
exit 1
else
exit 0
fi
[ $? -ne 0 ] && echo "failed!" && exit 1
他们是否相同呢?如果不是,如果我想将它写在一行中,我该怎么办?
检查返回值在ksh的壳,我想运行一个命令后,检查返回值,我已经写了两个款式:两种风格在KSH
if [ $? -ne 0 ] ; then
echo "failed!"
exit 1
else
exit 0
fi
[ $? -ne 0 ] && echo "failed!" && exit 1
他们是否相同呢?如果不是,如果我想将它写在一行中,我该怎么办?
他们很接近,但不一样。首先,即使echo
出于某种原因失败,if
将执行exit 1
;链式表达不会。此外,链式版本缺少相当于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 grep -q "pattern" /some/filename; then exit 0; else echo "failed!"; exit 1; fi
没关系:具有相反的条款,因为退出代码0是真实的 - 你只是这种表达的上方,以便设定$?
是短暂的,你可能想干脆直接把它作为if
表达跑对于这种简单的情况,但一般来说,您可能希望避免使用echo
。相反,请使用printf
- 或者如果您不介意仅使用ksh,则可以使用print
。与echo
的问题是,它并没有提供一种方法来对付怪异的字符串变量:
$ x=-n
$ echo "$x"
$
虽然两者printf
和print
做:
$ printf '%s\n' "$x"
-n
$ print - "$x"
-n
同样,不是这里有问题,或任何时候你只是打印一个文字字符串,但我发现完全训练自己脱离了echo
习惯更容易。
是的,我明白了,谢谢! – user1317752
为什么'print'比ksh中的echo更好? – Kamil
我编辑添加了对该问题的答案。我实际上会推荐'printf'(在具有它的'ksh'的现代版本中),因为它可以在shell中移植。 –