2012-06-29 53 views
4

检查返回值在ksh的壳,我想运行一个命令后,检查返回值,我已经写了两个款式:两种风格在KSH

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


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

他们是否相同呢?如果不是,如果我想将它写在一行中,我该怎么办?

回答

9

他们很接近,但不一样。首先,即使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" 
$ 

虽然两者printfprint做:

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

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

+0

是的,我明白了,谢谢! – user1317752

+0

为什么'print'比ksh中的echo更好? – Kamil

+0

我编辑添加了对该问题的答案。我实际上会推荐'printf'(在具有它的'ksh'的现代版本中),因为它可以在shell中移植。 –