Como dois tipos de uso de variáveis se comportam de maneira diferente [closed]

0

Eu escrevi um script bash que está executando um arquivo .jar com algumas opções. Surpreendentemente, descobri que usar variáveis com métodos diferentes resulta em comportamento diferente.

Uso 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

É assim que será executado:

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

Uso 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}

É assim que será executado:

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

De onde vêm essas opções do meio?

EDITAR:

Eu cometi um erro. Houve um passo de compilação java no meio que eu não notei antes. Essa compilação substitui as variáveis e a diferença está lá. Então, como disse @Kusalananda, não há diferença entre ${VAR} e $VAR usos.

Acho que devo postar uma nova pergunta e perguntar aos especialistas em Java por que a substituição de variáveis funciona dessa maneira.

    
por Zeinab Abbasimazar 14.05.2018 / 08:43

1 resposta

3

Assumindo que isso está realmente em um script de shell e não em algo como um Makefile ...

Não há absolutamente nenhuma diferença no shell entre $variable e ${variable} . Eles são intercambiáveis.

Pode-se usar ${variable} se for para ser expandido como parte de uma string e o caractere imediatamente seguinte for um caractere que seja válido como parte de um nome de variável, por exemplo, como em "${variable}A" .

Portanto, usar ${variable} não explica a diferença que você vê.

A única coisa certa é que JAVA_OPTS parece ter um valor diferente na segunda invocação.

    
por 14.05.2018 / 08:51

Tags