如果在 UNIX 中使用 #!/bin/sh shebang 时 Else 不工作

If Else not working when used #!/bin/sh shebang in UNIX

我正在使用 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 时,即使 first/second 如果条件为真,最后的 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

如何使用 shebang 获得与第一个代码片段相同的输出。

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

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

显然,两个场景中使用了不同的 shell(一些 shell 会自动创建某些变量)。

内核在没有 shebang 的情况下执行脚本的行为应该与脚本具有 shebang #!/bin/sh 的行为相同,但是,似乎有一些 shells,即 bashyashksh(可能还有其他人)通过直接在分叉子而不是 execing 中解释脚本来作弊。

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)"}"