Shell-Script

我需要雙引號變數嗎?

  • January 12, 2019

當我們對 shell 變數進行雙引號時,我感到很困惑。

具體來說,我正在使用以下 sed replace 命令:

sed -i.tmp "/$MY_VAR/d" /foo/bar/file.txt  

但我沒有引用$MY_VAR. 它是否正確?如果沒有,我怎麼引用它?

以下顯然不起作用

sed -i.tmp '/"$MY_VAR"/d' /foo/bar/file.txt  

在您的第一個命令中,您引用了變數。

作為第二個命令行參數傳遞給它的字元串sed有雙引號,並且變數在這些引號內,並且將由 shell 擴展。

正如您所指出的,第二個命令將不起作用(如預期的那樣),因為 shell 不會擴展變數的值,因為它是使用單引號引起來的。

第一個命令是正確的,但如果$MY_VAR包含斜杠,您將遇到問題。如果是這樣,請為sed未出現在 中的模式選擇一個分隔符$MY_VAR

sed "\@$MY_VAR@d"

當變數出現在引號中時,它被引用。該變數不需要被“嚴格引用”才能被引用。也就是說,在字元串"hello $world!"中,變數$world被引用,即使它不顯示為"$world"

重要的是整個字元串被引用。如果使用雙引號,則 shell 將擴展其中的所有變數。

在上面的範例中,字元串"\@$MY_VAR@d"被引用,變數$MY_VAR在其中,所以它也被引用(因為它在被引用的字元串內)。

引用自:https://unix.stackexchange.com/questions/399358