Shell-Script
我需要雙引號變數嗎?
當我們對 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
在其中,所以它也被引用(因為它在被引用的字元串內)。