2011-06-29 41 views
4

如果腳本有「」,爲什麼bash的行爲如此?

if [ $1 == "-?" ]; then #line 4 
    echo "usage: ...." 
fi 

當腳本獲取運行不帶任何參數,它會抱怨

./script.sh: line 4: [: ==: unary operator expected 

但如果不是

if [ "$1" == "-?" ]; then #line 4 
    echo "usage: ...." 
fi 

然後一切都很好

這是爲什麼?

感謝

回答

5

如果第一個參數缺少或爲空,你的第一個腳本計算結果爲:

if [ == "-?" ] ; then 

...這是一個語法錯誤。正如您所注意到,以防止你需要做的""使用,那麼它的計算結果爲:

if [ "" == "-?" ] ; then 

據我所知,這是由於原來的Bourne shell是工作的方式。你應該讓它成爲一個習慣,將變量放在""中,以便也可以正確使用其中包含空格的參數。例如,如果你打電話給你的腳本是這樣的:

./myScript "first argument has spaces" 

那麼你的第一個腳本將評估爲:

if [ first argument has spaces == "-?" ] ; then 

這也是一個語法錯誤。如果你使用空格傳遞文件名,rm $1也不會做你想做的事。改爲rm "$1"

5

因爲[執行前替換值。 [[不會,所以會按預期工作。

相關問題