web-dev-qa-db-fra.com

Comment puis-je fournir des arguments de valeur de variable à la commande dans un script Shell?

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?

2
Kashyap Kansara

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
3
steeldriver