如果在 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,即 bash
, yash
和 ksh
(可能还有其他人)通过直接在分叉子而不是 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)"}"
我正在使用 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,即 bash
, yash
和 ksh
(可能还有其他人)通过直接在分叉子而不是 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)"}"