(domの代わりに)bashスクリプトを使用して単純なxmlファイルを作成したいと思います。
しかし、行に値を設定すると エコvalの代わりに$ loremの単語を印刷してください。
ロレム=
echo '<root><foo a="b">$lorem</foo><bar value="ipsum" /></root>' >> $MY_XML
私も頑張ります。
echo '<root><foo a="b">\$lorem</foo><bar value="ipsum" /></root>' >> $MY_XML
echo '<root><foo a="b">"$lorem"</foo><bar value="ipsum" /></root>' >> $MY_XML
echo '<root><foo a="b">\"$lorem\"</foo><bar value="ipsum" /></root>' >> $MY_XML
しかし、それらはすべて値ではなく行を正確に印刷します。
val $loremを印刷する方法を提案してください。次の例のように
<root><foo a="b">LOL</foo><bar value="ipsum" /></root>
答え1
catでインラインドキュメントを使用する
cat >destfile <<EOF
<your ZML here...where $vas expand happly>
but the rest remain as is
EOF
私はこれを多くのスクリプトで使用します。また考慮してくださいenvsubst コマンドは変数を制限します。インライン文書で使用できます。
答え2
次のように行を印刷します。
echo '<root><foo a="b">'"$lorem"'</foo><bar value="ipsum" /></root>' >> "$MY_XML"
これは、単一引用符がシェルインタプリタが内部の環境変数を置き換えることを防ぐために必要です。
答え3
残念ながら、省略した組み合わせのいずれかが機能する可能性があります。
echo "<root><foo a=\"b\">$lorem</foo><bar value=\"ipsum\" /></root>" >> $MY_XML
一重引用符を使用すると、すべての内容が入力したとおりに正確に表示されます。脱出は\
機能しません。二重引用符は文字列を評価します。二重引用符内で\
特定の文字(二重引用符文字自体を含む)をエスケープするために使用できます。
さまざまな方法で参照される文字列部分を結合することもできます。ここでは$lorem
まだ二重引用符で囲まれていますが、文字列の残りの部分は一重引用符で囲まれています。
echo '<root><foo a="b">'"$lorem"'</foo><bar value="ipsum" /></root>' >> $MY_XML
答え4
XMLテンプレートに値を挿入するときは、特殊文字をエスケープする必要があります。
escape() {
local val
val=$1
val=${val//&/&}
val=${val//</<}
val=${val//>/>}
val=${val//\'/'}
val=${val//\"/"}
printf %s "$val"
}
lorem="\"Foo\" & 'Bar' & <Baz>"
cat << EOF
<root><foo a="b">$(escape "$lorem")</foo><bar value="ipsum" /></root>
EOF