Bash変数の特定の空間拡張を避けるには?
私にこれがあるとしましょう。
JAVA_OPTS="-Xmx1g"
JAVA_OPTS="$JAVA_OPTS -XX:OnError='/path/to/a/script.sh %p'"
function args() {
printf "%d :" $#
printf " <%s> " $@
echo
}
args $JAVA_OPTS
あなたは理解した
3 : <-Xmx1g> <-XX:OnError='/path/to/a/script.sh> <%p'>
私はこれが欲しい
2 : <-Xmx1g> <-XX:OnError='/path/to/a/script.sh %p'>
ベストアンサー1
最初にargs
1つの引数だけを指定しても、2つの引数が表示されます。
$ args "abc def"
1 : <abc> <def>
正しく表示するには、二重引用符を追加する必要があります。
$ function args() { printf "%d :" $#; printf " <%s> " "$@"; echo; }
$ args "abc def"
1 : <abc def>
しかし、の定義にはまだ問題がありますJAVA_OPTS
。観察する:
$ args $JAVA_OPTS
3 : <-Xmx1g> <-XX:OnError='/path/to/a/script.sh> <%p'>
$JAVA_OPTS
これは、シェルがコマンドラインに表示されたときにJAVA_OPTSの内容をトークン化しますが、その中に含まれる引用符を尊重または処理しないためです。
このタイプのアプリケーションでは、JAVA_OPTS を bash 配列として定義する方がよいでしょう。
$ JAVA_OPTS="-Xmx1g"
$ JAVA_OPTS=("$JAVA_OPTS" "-XX:OnError=/path/to/a/script.sh %p")
$ args "${JAVA_OPTS[@]}"
2 : <-Xmx1g> <-XX:OnError=/path/to/a/script.sh %p>
しかし、配列を扱うときに配列の内容を確認する便利な方法は次のとおりですdeclare -p
。
$ declare -p JAVA_OPTS
declare -a JAVA_OPTS='([0]="-Xmx1g" [1]="-XX:OnError=/path/to/a/script.sh %p")'