Bash編程中變量有無雙引號探祕

對於一般的變量,有無雙引號效果是一樣的,如下所示:

$ 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循環中使用,不要使用雙引號(留意上面提到的兩種方法)。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章