変数に二重引用符が必要ですか?

変数に二重引用符が必要ですか?

シェル変数を二重引用符で囲むと混乱します。
具体的には、次のsed代替コマンドを使用します。

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

しかし、私は引用しません$MY_VAR。そうですか?そうでない場合は、どのように引用できますか?
以下は明らかに機能しません

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

答え1

最初のコマンドでははい参照変数。

2番目のコマンドライン引数として渡される文字列にはsed二重引用符があり、変数はこの引用符内にあり、シェルによって拡張されます。

指摘したように、2番目のコマンドはシェルが一重引用符で囲まれた変数の値を拡張しないため(予想どおり)機能しません。

$MY_VAR最初のコマンドは正確ですが、スラッシュを含めると問題が発生します。そのsed場合は、次に表示されないパターンの区切り文字を選択してください$MY_VAR

sed "\@$MY_VAR@d"

変数はリーダー引用符の中に現れるとき。変数を「厳密に引用」する必要はありません。リーダー。つまり"hello $world!"、文字列内では$worldで表示されなくても変数を参照します"$world"

重要なのは、文字列全体が引用されることです。二重引用符を使用すると、シェルはその中のすべての変数を拡張します。

上記の例では、文字列が参照"\@$MY_VAR@d"され、その中に変数が$MY_VARあるため、参照もされます(引用符付き文字列内にあるため)。

関連情報