2016-07-29 30 views
0

我是新來的bash腳本編制,雖然我知道這無疑是一個重複的問題,但我無法弄清楚如何將它搜索出來。Bash「if」條件被執行,不管是什麼

for i in $(ls); do 
    FILETYPE=$(file -b $i) 
    if [ "$FILETYPE"="Apple binary property list" ]; then 
     echo $FILETYPE 
    else 
     echo "nope" 
    fi 
done 

我期待這時候的語句成功,並僅打印「不」,否則只打印
「蘋果二進制屬性列表」

發生什麼事情是它打印文件類型,不管語句是成功還是失敗,並且從不打印「nope」。

我知道這是簡單的,但有人可以告訴我爲什麼它打印除「Apple二進制屬性列表」和「不」之外的任何東西,
和我能做些什麼來解決它?

+3

嘗試添加字符串之間的一些空間的條件,如' 「$ FILETYPE」= 「...」' –

+3

使用shellcheck.net到找到你的腳本明顯的失誤 – anubhava

+0

我的問題是爲什麼會做什麼的如果,如果語句是不正確的......我會明白,如果只印有「沒了」,但它使零意義,我爲什麼會回聲$文件類型如果條件失敗 –

回答

2

不要使用此:

for i in $(ls); do 

,因爲它會破壞時的文件名包含空格或字符,如*。使用這個:

for i in *; do 

*展開到目錄中所有文件的列表。


不要忘記註明您的shell變量,相關原因:

FILETYPE=$(file -b "$i") 

此通過整體變量作爲一個參數,這是你想要的。


[是一個命令,它採用的參數列表,用空格分隔:

if [ "$FILETYPE" = "Apple binary property list" ]; then 

不含空格,[只看到兩個參數,"$FILETYPE"="Apple binary property list"]


再次使用引號變量:

echo "$FILETYPE" 
+0

「[是需要的參數列表,用空格分隔命令」 =頭腦吹 –

0

問題是,方括號[是一個命令,它是test命令的別名,以及它期望其參數的所有命令都由空格分隔。

當你寫(沒有任何間距)

"$FILETYPE"="Apple binary property list" 

這是一個參數的test命令,它使用單一參數作爲一個非空字符串,它永遠是正確的。

當你添加空格,像

"$FILETYPE" = "Apple binary property list" 

test命令有三個參數,並正確解析它作爲一個字符串,操作和另一個字符串。