変数を挿入して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>
変数は、二重引用符で囲まれた文字列にのみ埋め込むことができます。
この作業を簡単かつ安全に行う方法は、次のように単一引用符で囲まれた文字列を抜け出すことです。
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
はシェルの組み込みなので、この代替案はおそらく最初に私の最初の提案と一致しています。
変数の展開は単一引用符の文字列では発生しません。
文字列には二重引用符を使用でき、内部の二重引用符は\
でエスケープできます。このような :
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>