對於一般的變量,有無雙引號效果是一樣的,如下所示:
$ sport="marathon"
$ echo $sport
marathon
$ echo "$sport"
marathon
那麼,對於二般的變量,就有差別了,如下:
$ cat sports.txt
walking running swimming
singing drawing dancing
basketball volleyball soccer
$ sports=$(cat sports.txt)
$ echo $sports
walking running swimming singing drawing dancing basketball volleyball soccer
$ echo "$sports"
walking running swimming
singing drawing dancing
basketball volleyball soccer
如上sports變量加上了雙引號,echo "$sports"是將其原封不動的,作爲一個整體輸出。
原封不動是指,sports.txt文件中內容格式是什麼樣子,輸出就是什麼樣子的。作爲一個整體輸出,又如何理解呢,可結合下面的for循環看下,其中${item}多加了‘-z’,是爲了標示輸出次數。可見變量加上雙引號,只輸出了一次。
$ for item in $sports; do echo ${item}-z; done
walking-z
running-z
swimming-z
singing-z
drawing-z
dancing-z
basketball-z
volleyball-z
soccer-z
$ for item in "$sports"; do echo ${item}-z; done
walking running swimming singing drawing dancing basketball volleyball soccer-z
類似sports這樣的變量,在for循環中,一般是爲了分析其中的每一行,因爲"$sports"形式,作爲一個整體輸出了,所以不能用。只剩下$sports這種形式了,貌似該形式又輸出次數太多了,其實這和Bash中的IFS(Internal Field Separator)變量有關,此處對IFS不做展開說明了,只給出兩種解決方法。
第一種,改變IFS,示例代碼如下:
$ sports=$(cat sports.txt)
$ old_ifs="$IFS"
$ IFS=$'\n'
$ for item in $sports; do echo $item; done
walking running swimming
singing drawing dancing
basketball volleyball soccer
$ IFS="$old_ifs"
$ for item in $sports; do echo $item; done
walking
running
swimming
singing
drawing
dancing
basketball
volleyball
soccer
第二種,先格式化sports.txt文件,示例代碼如下:
$ sed -i -r 's/[ \t]{1,}/,/g' sports.txt
$ cat sports.txt
walking,running,swimming
singing,drawing,dancing
basketball,volleyball,soccer
$ sports=$(cat sports.txt)
$ for item in $sports; do echo $item; done
walking,running,swimming
singing,drawing,dancing
basketball,volleyball,soccer
對於兩者,個人比較推薦第二種方法,預先格式化要處理的文件,可以確保熟知文件格式。
對Bash編程中,變量是否要加雙引號,稍作總結:
1. 若打印變量內容(或將該變量作爲參數傳遞給一個函數/腳本),要使用雙引號。
2. 若變量在for循環中使用,不要使用雙引號(留意上面提到的兩種方法)。