【问题标题】:Bourne: if statement testing exit statusBourne:if 语句测试退出状态
【发布时间】:2010-04-23 14:16:23
【问题描述】:

有什么区别:

if IsServerStarted ; then ...

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

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

【问题讨论】:

  • @skaaffman 将标签从 bourne 更改为 bash。为什么? Bourne 不是 bash 的一个子集吗?
  • Bourne 是 1970 年代的一个古老的 shell,没有人再使用了——它不是严格的 bash 子集(例如,Bourne 允许 ^ 作为管道字符,而在现代 POSIX shell 中,包括 bash,只有 | 有效)。在现代系统上,/bin/sh 保证是符合 POSIX sh 的 shell,这是一个受 ksh 严重影响的新规范,ksh 是从 Bourne 获得灵感的以前的商业 shell。因此,从现代贝壳返回伯恩有一条漫长而曲折的道路,但这不是今天任何人使用的东西;即使在 20 年前,也只有 Solaris 还在发货。
  • ...所以说 POSIX sh 和 bash 是“Bourne 系列”外壳是正确的,但它们实际上并不与 Bourne 兼容——并非所有 Bourne 代码都可以在它们上运行。 (并且编写与 pre-POSIX Bourne 正确运行的代码还需要大量额外的工作来处理古老版本的 test/[ 中的错误——当人们回到 pre-POSIX 世界时,一些"x$foo" 成语其实是有理由存在的)。

标签: shell if-statement sh exitstatus


【解决方案1】:

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

if IsServerStarted ; then ...

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

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

【讨论】:

    【解决方案2】:

    实际上,第二个会报错,抱怨“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 ...
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 2020-12-23
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多