2017-10-16 103 views
1

我正在使用AIX 6.1。下面的代碼對我來說工作得很好。如果Else在UNIX中不工作#!/ bin/sh shebang在UNIX中

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

但是,當我在我的代碼使用家當,始終是越來越執行的最後一個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 

我怎樣才能得到相同的輸出作爲第一個代碼段,但使用家當。

P.S. :由於某些限制,我不能在不使用shebang的情況下編寫腳本。

+0

哪個shell是您的登錄shell?它和/ bin/sh是一樣的嗎? $> env | grep SHELL 如果你正在運行bash變體,會告訴你你的shell – Spangen

+0

env | grep SHELL給SHELL =/usr/bin/ksh 而且我的壞,如果條件裏面有空格。編輯問題 – Rohit

+0

當使用ksh時,此頁面建議您需要[[]] https://www.cyberciti.biz/faq/ksh-if-command-examples/amp/ – Spangen

回答

0

正如Lorinczy Zsigmond建議的那樣,在腳本的開始部分添加了HOSTNAME="$(hostname)",它工作正常。

0

顯然,在兩種情況下使用了不同的shell(某些shell會自動創建某些變量)。

內核execing腳本沒有認領應該表現一樣,如果腳本有家當#!/bin/sh,但是,它似乎有些炮彈,即bashyash,並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來Exec中認領少子腳本:

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