2017-04-06 101 views
2
#!/bin/bash 
echo "===========3333333=====" 

if [ $0 == "test" ] || $0 == "all" ];then 
    echo "---" 
fi 

無限循環輸出:爲什麼這個shell腳本輸出這麼奇怪

===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 
===========3333333===== 

雖然我知道錯了是缺少方括號 如果[$ 0 == 「測試」] || [$ 0 ==「全部」];然後 但爲什麼輸出像?

回答

4

考慮行if [ $0 == "test" ] || $0 == "all" ]

這是形式if cmd1 || cmd2,其中CMD1是[ $0 == "test ] 和CMD2是$0 == "all" ]

這第二個命令與參數==all,並]調用你的腳本。所以你有一個遞歸。

記住,[是shell語法一部分。這只是一個具有奇怪特徵的命令,要求它的最後一個參數是]

+0

雖然這是有道理的,我現在還不能確定,這詞開始遞歸?你願意解釋更多嗎? – Inian

+2

有一些有趣的事情要注意。具體來說,當以'。/ test.sh'調用時,腳本遞歸,但當以'bash test.sh'調用時,* *不會*,因爲它產生不同的$ 0。 –

+0

@JanHudec:是的公平點!即將提及它! – Inian

1
$0 == "all" ];then 

本節開始遞歸。因爲$ 0再次啓動腳本。

例如下面的代碼是生產相同的結果

#!/bin/bash 
echo "===========3333333=====" 
$0 bash is not checking below!!!!!!!!!! 
     echo "ok" 
fi