的区别是什么:伯恩:if语句测试退出状态
if IsServerStarted ; then ...
和
if [ IsServerStarted -eq 0 ] ; then ...
在我看来,这两个说法应该是等价的?奇怪的是,第二种说法总是如此。
的区别是什么:伯恩:if语句测试退出状态
if IsServerStarted ; then ...
和
if [ IsServerStarted -eq 0 ] ; then ...
在我看来,这两个说法应该是等价的?奇怪的是,第二种说法总是如此。
以下运行在$PATH
命名IsServerStarted
壳功能或可执行文件,并且如果它的退出代码是0
(即真),运行then
分支。如果这样的函数或可执行文件不存在,退出代码将为非0
(即false),跳过跳转。
if IsServerStarted ; then ...
下面具有[
(又名test
)检查IsServerStarted
是否等于0
,其中(IsServerStarted
甚至不含有一个单一的数字的整数)总是假。因此,[
以非0
(即错误)代码退出,跳转总是跳过。
if [ IsServerStarted -eq 0 ] ; then ...
事实上,第二个会给出一个错误,抱怨“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 ...
这只是测试变量是否等于零。如果它不是一个有效的整数,它会导致一个错误信息。
@skaaffman将标记从bourne更改为bash。为什么? Bourne不是bash的子集吗? – sixtyfootersdude 2010-04-23 14:37:18