「」を含む文字列内に変数を挿入する方法は?


25

変数を挿入して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>

2
XMLドキュメントに2つのトップレベルタグを含めることはできません。また、2016年です。iso-8859-1ではなく、utf-8を使用することを強くお勧めします。
セラダ

回答:


29

変数は二重引用符で囲まれた文字列にのみ埋め込むことができます。

この作業を行う簡単で安全な方法は、次のように単一引用符で囲まれた文字列から抜け出すことです。

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")

サブシェルを使用して同じ効果を達成するため、これは劣っています。これは不必要な余分なプロセスです。

以下のよう@steeldriverはコメントに書いた、のbashの最近のバージョンでは、あなたはサブシェルを避けるために、このように書くことができます。

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

以来printfシェル組み込みで、この代替は、一番上の私の最初の提案で一部の上にある可能性があります。


7

単一引用符文字列では変数の展開は行われません。

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

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>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.