4

有什么区别:

if IsServerStarted ; then ...

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

在我看来,这两个陈述应该是等价的?奇怪的是,第二个陈述总是正确的。

4

2 回答 2

9

下面在$PATHnamed中运行 shell 函数或可执行文件IsServerStarted,如果其退出代码为0(即 true),则运行then分支。如果这样的函数或可执行文件不存在,则退出代码将为非0(即假)并且then将跳过分支。

if IsServerStarted ; then ...

下面有[(又名test)检查是否IsServerStarted是一个整数等于0,其中(IsServerStarted甚至不包含单个数字)总是false。因此,[以非0(即假)代码退出并且then总是跳过分支。

if [ IsServerStarted -eq 0 ] ; then ...
于 2010-04-23T14:21:47.420 回答
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 theif` 会通过或失败。

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

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

于 2010-04-23T17:04:29.060 回答