""を含む文字列に変数を挿入するには?

""を含む文字列に変数を挿入するには?

変数を挿入してxml文字列を構築したいと思います。

str1="Hello"
str2="world"

xml='<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>'

echo $xml

結果は

<?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2>

しかし、私が得るものは次のとおりです。

<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>

私も試しました

xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>"

ただし、これは内部二重引用符を削除し、以下を提供します。

<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>

答え1

二重引用符で囲まれた文字列内にのみ変数を含めることができます。

これを行う簡単で安全な方法は、次のように一重引用符で囲まれた文字列を分割することです。

xml='<?xml version="1.0" encoding="iso-8859-1"?><tag1>'"$str1"'</tag1><tag2>'"$str2"'</tag2>'

一重引用符で囲まれた文字列をエスケープし、変数を二重引用符で囲みました。これは、特殊文字を含む変数が安全であることを確認するためのものです。

別の方法を要求されたので、以下は悪い選択肢ですprintf

xml=$(printf '<?xml version="1.0" encoding="iso-8859-1"?><tag1>%s</tag1><tag2>%s</tag2>' "$str1" "$str2")

これは、同じ効果を得るためにサブシェルを使用するので劣り、これは不要な追加プロセスです。

〜のように@スチールドライバコメントに記載されているように、最新バージョンのbashでは、次のように書くことでサブシェルを回避できます。

printf -v xml ' ... ' "$str1" "$str2"

printfこれはシェル組み込みであるため、この代替案はおそらく一番上の最初の提案の一部です。

答え2

一重引用符で囲まれた文字列内では変数の拡張は行われません。

文字列に二重引用符を使用し、内部二重引用符をエスケープできます\。このように:

xml="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><tag1>$str1</tag1><tag2>$str2</tag2>"

結果出力:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>

関連情報