2012年11月13日 星期二

Linux Shell Script 空字串比較

在 shell script 中遇到一件奇怪的事,雖然了解之後也就沒什麼,但是在找問題的過程中,真的是困擾很久。因為問題是出在 Embedded System 的環境上,所以一開始看到的訊息很難猜到它大概位置,只好土法練鋼,一段一段地執行,邊執行邊找問題點。它的訊息是這樣的

sh: : unknown operand

沒有行數,沒有關鍵字元,真是不知道問題在哪!在重開了不知道幾次的機器之後,終於讓我找到問題是什麼!

#Find thd path while SD card plugin
if [ -e /mnt/sd ]; then
       mmc=`ls /mnt/sd`
fi
if [ ${mmc} != "" ]; then
       #Do something
fi

也不知道是不是因為對 shell script 不熟的關係,上面的判斷我真的是看不出來有什麼問題。原來會造成 sh: :  unknown operand 的原因就在 ${mmc} != "" 這一行裡。當我找到是在這裡時,老實說,我還不了解為什麼。我試著在 Linux PC 平台上執行類似的程式碼,如下:

#!/bin/sh
test=""

if [ ${test} != "" ]; then
       echo "Pass"
else
       echo "Fail"
fi

沒想到還真的有問題!它出現了這樣的訊息

[: 9: !=: unexpected operator
Fail

比起我使用的 Embedded System,倒是多了數字和符號,在 Linux PC 找問題點容易多了。這裡是因為判斷空字串出了問題,${test} 必須用雙引號括起來才行,像這樣
"${test}" != ""。改完了之後,再執行一次就不會再出現 [: 9: !=: unexpected operator 這個訊息了。

另外也有人用別的方式寫,使用 -z ${test} 的方式來判斷 ${test} 是否為空字串。再回頭看看 Embedded System 上的 shell script,同樣地,就只要在 ${mmc_folder} 加上雙引號,就不會出現 sh: :  unknown operand 這個訊息了。

沒有留言:

張貼留言