【问题标题】:If Else not working when used #!/bin/sh shebang in UNIX如果在 UNIX 中使用 #!/bin/sh shebang 时 Else 不起作用
【发布时间】:2018-03-28 00:32:56
【问题描述】:

我使用的是 AIX 6.1。下面的代码对我来说工作正常。

if [ "$HOSTNAME" = "host1" ]; then
  echo "This is host1"
elif [ "$HOSTNAME" = "host2" ]; then
  echo "This is host2"
else
  echo "This is another host"
fi

但是当我在我的代码中使用 Shebang 时,即使第一个/第二个 if 条件为真,也总是会执行最后一个 else 部分。

#!/bin/sh
if [ "$HOSTNAME" = "host1" ]; then
  echo "This is host1"
elif [ "$HOSTNAME" = "host2" ]; then
  echo "This is host2"
else
  echo "This is another host"
fi

如何获得与第一个代码 sn-p 相同的输出,但使用 shebang。

附: : 由于某些限制,我无法在不使用 shebang 的情况下编写脚本。

【问题讨论】:

  • 你的登录shell是哪个shell?它与 /bin/sh 相同吗? $> 环境 | grep SHELL 如果您正在运行 bash 变体,会告诉您您的 shell
  • 环境 | grep SHELL 给出 SHELL=/usr/bin/ksh 我不好,if 条件里面有一个空格。编辑了问题
  • 使用ksh时,本页提示需要[[ ]] cyberciti.biz/faq/ksh-if-command-examples/amp
  • 试过了,但仍然坚持下去。当我不使用 shebang line 时,不明白它是如何工作的。
  • 但是[]前后的空格不是重复的问题

标签: shell unix aix


【解决方案1】:

正如 Lorinczy Zsigmond 建议的那样,在脚本开头添加了 HOSTNAME="$(hostname)" 并且它起作用了。

【讨论】:

    【解决方案2】:

    显然,在这两种情况下使用了不同的 shell(一些 shell 会自动创建某些变量)。

    执行没有 shebang 的脚本的内核的行为应该与脚本具有 shebang #!/bin/sh 的行为相同,但是,似乎某些 shell,即 bashyashksh(可能还有其他) 通过直接在 fork-child 而不是 execing it 中解释脚本来作弊。

    id_shell:

    if false; then :
    elif [ -n "${BASH_VERSION:-}" ]; then echo bash
    elif [ -n "${KSH_VERSION:-}" ]; then echo ksh
    elif [ -n "${POSH_VERSION:-}" ]; then echo posh
    elif [ -n "${YASH_VERSION:-}" ]; then echo yash
    elif [ -n "${ZSH_VERSION:-}" ]; then echo zsh
    else
        echo sh;
    fi
    

    测试使用什么 shell 来执行无 shebang 的子脚本:

    $ for sh in bash dash posh pdksh sh yash zsh ksh; do echo -n $sh: ; $sh -c './idself'; done
    
    bash:bash
    dash:sh
    posh:sh
    pdksh:sh
    sh:sh
    yash:yash
    zsh:sh
    ksh:ksh
    

    要解决您的特定问题,您可以定义 HOSTNAME(如果尚未定义):

    : "${HOSTNAME:="$(hostname)"}"
    

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 2019-01-20
      • 2021-10-17
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2013-07-01
      • 1970-01-01
      相关资源
      最近更新 更多