当我们双引号 shell 变量时,我感到很困惑。
具体来说,我使用以下 sed 替换命令:
sed -i.tmp "/$MY_VAR/d" /foo/bar/file.txt
但我不是在引用$MY_VAR
。它是否正确?如果没有的话怎么引用呢?
下面的显然不行
sed -i.tmp '/"$MY_VAR"/d' /foo/bar/file.txt
答案1
在你的第一个命令中,你是引用变量。
作为第二个命令行参数传递的字符串sed
带有双引号,变量位于这些引号内并将由 shell 扩展。
正如您所指出的,第二个命令将不起作用(如预期),因为 shell 不会扩展变量的值,因为它是使用单引号引起来的。
$MY_VAR
第一个命令是正确的,但如果包含斜杠,则会出现问题。如果是,请为sed
中未出现的模式选择一个分隔符$MY_VAR
:
sed "\@$MY_VAR@d"
一个变量是引当它出现在引号中时。该变量不需要“严格引用”即可引。也就是说,在字符串 中"hello $world!"
,即使变量$world
不显示为 ,它也会被引用"$world"
。
重要的是整个字符串被引用。如果使用双引号,那么 shell 将扩展其中的所有变量。
在上面的示例中,字符串"\@$MY_VAR@d"
被引用,并且变量$MY_VAR
位于其中,因此它也被引用(因为它位于被引用的字符串内)。