0

bash スクリプト内で、xmlstarlet ツールの xml ed コマンドに引数を渡したいと考えています。スクリプトは次のとおりです。

#!/bin/bash
# this variable holds the arguments I want to pass
ED=' -u "/a/@id" -v NEW_ID -u "/a/b" -v NEW_VALUE'
# this variable holds the input xml
IN='
<a id="OLD_ID">
    <b>OLD_VALUE</b>
</a>
'
# here I pass the arguments manually
echo $IN | xml ed -u "/a/@id" -v NEW_ID -u "/a/b" -v NEW_VALUE input.xml
# here I pass them using the variable from above
echo $IN | xml ed $ED

最初の呼び出しが機能するのはなぜですか、つまり、望ましい結果が得られるのはなぜですか。

# echo $IN | xml ed -u "/a/@id" -v NEW_ID -u "/a/b" -v NEW_VALUE input.xml
<?xml version="1.0"?>
<a id="NEW_ID">
  <b>NEW_VALUE</b>
</a>

2番目の呼び出しは機能しませんが、つまり、次のようになります。

# echo $IN | xml ed $ED
<?xml version="1.0"?>
<a id="OLD_ID">
  <b>OLD_VALUE</b>
</a>
4

2 に答える 2

3

ではbash、このようにオプションのリストに配列を使用することをお勧めします。EDこの場合、 に埋め込まれた項目には空白が含まれていないため、違いはありません。

#!/bin/bash
# this variable holds the arguments I want to pass
ED=( -u "/a/@id" -v NEW_ID -u "/a/b" -v NEW_VALUE)
# this variable holds the input xml
IN='
<a id="OLD_ID">
    <b>OLD_VALUE</b>
</a>
'
# here I pass the arguments manually
echo $IN | xml ed -u "/a/@id" -v NEW_ID -u "/a/b" -v NEW_VALUE input.xml
# here I pass them using the variable from above
echo $IN | xml ed "${ED[@]}"
于 2013-05-20T23:28:25.703 に答える