2種類の変数はどのように異なる動作をしますか?[閉じる]

2種類の変数はどのように異なる動作をしますか?[閉じる]

.jarいくつかのオプションを使用してファイルを実行するbashスクリプトを作成しました。驚いたことに、別の方法で変数を使用すると、異なる動作が発生することがわかりました。

使用法1:

JAR_FILE="my_jar_file.jar"
JAVA_OPTS="-mx4096M"
GC_OPTS="-XX:+UseG1GC"
echo "java "$GC_OPTS" "$JAVA_OPTS" -jar "$JAR_FILE
java $GC_OPTS $JAVA_OPTS -jar $JAR_FILE

実行方法は次のとおりです。

java -XX:+UseG1GC -mx4096M -jar my_jar_file.jar

使用法2:

JAR_FILE="my_jar_file.jar"
JAVA_OPTS="-mx4096M"
GC_OPTS="-XX:+UseG1GC"
echo "java "${GC_OPTS}" "${JAVA_OPTS}" -jar "${JAR_FILE}
java ${GC_OPTS} ${JAVA_OPTS} -jar ${JAR_FILE}

実行方法は次のとおりです。

java -XX:+UseG1GC -Xmx3072m -XX:MaxPermSize=1024m  -Djava.net.preferIPv4Stack=true -jar my_jar_file.jar

これらの中間オプションはどこから来ましたか?

編集する:

私は間違いを。途中で、以前は気付かなかったJavaビルドステップがあります。ビルドは変数を置き換えており、違いがあります。したがって、@Kusalanandaが言ったように、${VAR}これと使用法に違いはありません$VAR

私は新しい質問をし、Javaの専門家に変数置換がなぜこのように機能するのか尋ねなければならないと思いました。

答え1

これが実際にMakefileや他のものではなくシェルスクリプトにあると仮定すると...

$variable間のシェルにはまったく違いはありません${variable}。それらは交換可能です。

${variable}文字列の一部に展開し、直後の文字が変数名の一部として有効な文字である場合(これは使用できます)"${variable}A"

したがって、使用法は${variable}あなたが見る違いを説明しません。

確かなことは、JAVA_OPTS2番目の呼び出しでは異なる値を持つようです。

関連情報