Bashスクリプトを使用したXMLファイルの作成

Bashスクリプトを使用したXMLファイルの作成

(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//&/&amp;}
    val=${val//</&lt;}
    val=${val//>/&gt;}
    val=${val//\'/&apos;}
    val=${val//\"/&quot;}
    printf %s "$val"
}

lorem="\"Foo\" & 'Bar' & <Baz>"

cat << EOF
<root><foo a="b">$(escape "$lorem")</foo><bar value="ipsum" /></root>
EOF

関連情報