J'essaie de créer un script Shell dans lequel je souhaite passer l'indicateur -classpath "classpath-value"
à la commande javac
. Je sais que je peux utiliser la variable d'environnement CLASSPATH
pour définir le chemin de classe, mais j'ai un besoin très spécifique de le faire de cette façon.
Ce que je veux:
$ classpath_val="-classpath \"/opt/Apache-Tomcat-8.5.20/lib/servlet-api.jar\""
$ javac $classpath_val com/example/Test.Java
Cependant, lorsque j'ai exécuté la deuxième commande, elle s'exécute simplement comme si le classpath_val n'était pas fourni. Il n'utilise donc pas le -classpath flag
.
Mais si je répète la même commande, je reçois:
$ echo javac $classpath_val com/example/Test.Java
javac -classpath "/opt/Apache-Tomcat-8.5.20/lib/servlet-api.jar" com/example/Test.Java
Ce qui est parfaitement juste.
Pourquoi cela arrive-t-il? Est-ce que je ne peux pas fournir d'arguments à une commande à partir d'une valeur de variable?
Dans bash
, le moyen le plus robuste de procéder consiste à utiliser un tablea p. Ex.
classpath_val=("-classpath" "/opt/Apache-Tomcat-8.5.20/lib/servlet-api.jar")
puis développez chaque élément de manière sécurisée, en utilisant
javac "${classpath_val[@]}" com/example/Test.Java
La citation des éléments dans la construction et l'expansion du tableau empêche leur division en espaces blancs. Pour illustrer:
$ arr=("foo" "bar baz")
$ set -- "${arr[@]}"
$ for f; do echo "$f"; done
foo
bar baz