“ ”を含む文字列内に変数を挿入するにはどうすればよいですか?

変数を挿入して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ドキュメントに2つのトップレベルタグを含めることはできません。また、2016年は'、iso-8859-1ではなくutf-8を使用することを強くお勧めします。

回答

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

これを機能させる簡単で安全な方法は次のとおりです。次のように一重引用符で囲まれた文字列から抜け出すには:

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

一重引用符で囲まれた文字列から抜け出した後、変数をdouble-で囲んだことに注意してください。引用符。これは、変数内に特殊文字を安全に含めるためです。

別の方法を求めたので、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> 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です