2010-04-23 51 views
3

的区别是什么:伯恩:if语句测试退出状态

if IsServerStarted ; then ... 

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

在我看来,这两个说法应该是等价的?奇怪的是,第二种说法总是如此。

+1

@skaaffman将标记从bourne更改为bash。为什么? Bourne不是bash的子集吗? – sixtyfootersdude 2010-04-23 14:37:18

回答

8

以下运行在$PATH命名IsServerStarted壳功能或可执行文件,并且如果它的退出代码是0(即真),运行then分支。如果这样的函数或可执行文件不存在,退出代码将为非0(即false),跳过跳转。

if IsServerStarted ; then ... 

下面具有[(又名test)检查IsServerStarted是否等于0,其中(IsServerStarted甚至不含有一个单一的数字的整数)总是。因此,[以非0(即错误)代码退出,跳转总是跳过。

if [ IsServerStarted -eq 0 ] ; then ... 
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 ... 

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