2014-11-24 118 views
6

我讀過的幾乎所有地方,包括谷歌的bash腳本風格指南提及引用命令替換的必要性(當然除非特別需要)。是否有必要在bash中的變量賦值時引用命令替換?

我瞭解在一般使用期間引用命令替換的時間/地點/原因。例如:echo "$(cat <<< "* useless string *")"而非echo $(...)

然而,對於變量賦值具體而言,我看到這樣的例子很多這樣: variable="$(command)"

然而,我已經發現沒有實例,其中variable=$(command)是不等價的。

variable="$(echo "*")"variable=$(echo "*")都將值設置爲'*'。

任何人都可以給出任何情況下,在變量分配期間不加引用會導致一個問題嗎?

+0

好問題!我做了很多測試,看起來他們完全一樣,沒有區別。 – fedorqui 2014-11-24 09:26:47

+0

我想他問的問題可能會發生在$ cmd,$ {cmd}。在替代和If子句中,我們需要「」在那裏。請糾正,如果我錯了 – 2014-11-24 09:29:10

回答

6

shell不執行字分割用於變量賦值(它由POSIX標準化,您可以依賴它)。因此,你不需要雙引號(但你可以使用,而不必使不同的結果)在

variable=$(command) # same as variable="$(command)" 

然而,字拆分執行命令之前進行,所以在

echo $(command) 
echo "$(command)" 

結果可能不一樣。後者保留所有多空間序列,而前者使每個單詞成爲不同的回聲。由您來決定哪個是理想的行爲。

有趣的殼怪癖:還有一個地方引用一個替代或沒有差別,即在case expr in構造中的表達。

case $FOO in 
    (frob) ...;; 
esac 

無法區分

case "$FOO" in 
    (frob) ...;; 
esac 
+2

這就是這個答案所說的。 – 2014-11-24 09:34:36

+0

如果需要,你能給出一個鏈接到POSIX標準的確切部分嗎?我很難找到它。 – Lucas 2016-05-17 12:09:41

+2

@Lucas我會翻譯2.9.1簡單命令,http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01中的#4:*「每個變量賦值都應擴展爲波形擴展,參數擴展,命令替換,算術擴展和賦值之前的引用移除「。*這裏沒有說明分詞。 – Jens 2016-05-17 15:20:33

-2

測試有這麼多不同的命令,這是一樣的。無法找到差異。

+1

這不是問題的答案。看看有什麼不同,試着'echo $(echo -e「hello \ nworld」)''echo'echo(echo -e「hello \ nworld」)「' – jeb 2017-01-04 14:32:25

4

當使用bash,這兩條線是100%當量:

variable="$(command)" 
variable=$(command) 

而這兩個都沒有:

echo $(command) 
echo "$(command)" 

唉,人腦是不是一個計算機。重複工作尤其不夠可靠。

因此,如果您混合使用樣式(即,當您使用命令參數時引用,但在分配變量時不引用),那麼偶爾會發生錯誤。

更糟糕的是,偶爾你會希望將命令結果擴展爲單個單詞。讀下你的代碼的下一個人會懷疑他是否在看bug。

結束語:由於前兩行是相同的,所以在平均大腦上總是容易引用$()(即使沒有必要),以確保您始終在必要時引用它。

+2

好吧,那有道理,如此頻繁......當我第一次開始編寫shell腳本時,我把它作爲一般規則引用。現在我對它更加熟悉了,我只是試圖消除任何多餘或不必要的東西。 – Six 2014-11-24 10:26:58