Bourne:if语句测试退出状态

时间:2010-04-23 14:16:23

标签: shell if-statement sh exitstatus

有什么区别:

if IsServerStarted ; then ...

if [ IsServerStarted -eq 0 ] ; then ...

我觉得这两个陈述应该是等价的吗?奇怪的是,第二种说法总是如此。

2 个答案:

答案 0 :(得分:9)

以下运行名为$PATH的{​​{1}}中的shell函数或可执行文件,如果其退出代码为IsServerStarted(即为true),则运行0分支。如果不存在此类函数或可执行文件,则退出代码将为非then(即为false),并且将跳过0分支。

then

以下if IsServerStarted ; then ... (又名[)检查test是否是等于IsServerStarted的整数,(0甚至不包含一位数)总是错误。因此,IsServerStarted以非[(即假)代码退出,并始终跳过0分支。

then

答案 1 :(得分:0)

实际上,第二个会给出一个错误,抱怨“IsServerStarted”不是一个有效的整数。它被认为是一个字符串常量,如

var="IsServerStarted"
if [ IsServerStarted == "$var" ] ; then

会成功(如果不相等则会失败)。

关于您提供的第一个示例中的可执行文件或函数,

ndim 是正确的。

需要考虑更多变化:

if $IsServerStarted ; then ...

在那个中,if是根据变量IsServerStarted中包含的命令(可执行文件或函数)的返回值来计算的。因此,您可以设置IsServerStarted=true,然后if将成功,因为true是一个始终返回true的shell内置函数。你可以设置IsServerStarted='grep popsicle freezer' and the,如果`通过或失败,取决于你是否已经没有了。

if [ $IsServerStarted -eq 0 ]; then ...

这只是测试变量是否等于零。如果它不是有效的整数,则会导致错误消息。