シェルスクリプトで文字列を正しく連結する方法は?

シェルスクリプトで文字列を正しく連結する方法は?

修正する必要があるbashスクリプトがあります。変数を設定してから別のスクリプトを呼び出す必要があります。私の変数EXTRA_JAVA_OPTIONS

-javaagent:myagent.jar="-d 0 -i 1000 -l log2 -c log1"

だから私がしたことは

export EXTRA_JAVA_OPTIONS="-javaagent:myagent.jar=\"-d 0 -i 1000 -l log2 -c log1 \""

次に、スクリプト内に次の内容を含むスクリプトを呼び出します。

"$JAVACMD" "$EXTRA_JAVA_OPTIONS"

しかし、このようにしても、私が望む結果は出ません。 bash -xを実行するとわかります。

+ /usr/java/jdk1.6.0_38/bin/java '-javaagent:myagent.jar="-d 0 -i 1000 -l log2 -c log1"'

代わりに、次の操作を行います。

"$JAVACMD" $EXTRA_JAVA_OPTIONS

異なるバージョンの出力が表示されますが、これも間違っています。

+ /usr/java/jdk1.6.0_38/bin/java '-javaagent:myagent.jar="-d' 0 -i 1000 -l log2 -c 'log1"'

'文字列がシェルから印刷または追加されたときにこれが発生しないようにするにはどうすればよいですか?

答え1

配列を使用することは、空白を含む引数をそのまま維持する安全な方法です。

EXTRA_JAVA_OPTIONS=(-javaagent:myagent.jar="-d 0 -i 1000 -l log2 -c log1")
"$JAVACMD" "${EXTRA_JAVA_OPTIONS[@]}"

答え2

引用符は、単語だけで区切られないようにするためのものです。ところで、あなたはその内容をすべて引用しました。

export EXTRA_JAVA_OPTIONS="-javaagent:myagent.jar=-d 0 -i 1000 -l log2 -c log1"

関連情報