web-dev-qa-db-ja.com

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

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

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

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

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はシェルの組み込みなので、この代替案はおそらく最初に私の最初の提案と一致しています。

31
janos

変数の展開は単一引用符の文字列では発生しません。

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

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>
9
Sidahmed