Я пытаюсь создать сценарий оболочки, в котором я хочу передать флаг -classpath "classpath-value"
команде javac
. Я знаю, что могу использовать переменную окружения CLASSPATH
для установки пути к классам, но у меня есть особая потребность сделать это таким образом.
Что я хочу:
$ classpath_val="-classpath \"/opt/apache-tomcat-8.5.20/lib/servlet-api.jar\""
$ javac $classpath_val com/example/Test.java
Однако, когда я выполнил вторую команду, она просто выполняется, как если бы classpath_val не был предоставлен, поэтому она не использует -classpath flag
.
Но если я повторяю ту же команду, я получаю:
$ echo javac $classpath_val com/example/Test.java
javac -classpath "/opt/apache-tomcat-8.5.20/lib/servlet-api.jar" com/example/Test.java
Что совершенно верно.
Почему это происходит? Это то, что я не могу предоставить аргументы команды из значения переменной?
В bash
, вероятно, самый надежный способ сделать это - использовать массив , например
classpath_val=("-classpath" "/opt/apache-tomcat-8.5.20/lib/servlet-api.jar")
затем разверните каждый элемент безопасным для пробелов способом, используя
javac "${classpath_val[@]}" com/example/Test.java
. Цитирование элементов как в построении массива, так и в расширении предотвращает их разбиение на пустое пространство. Для иллюстрации:
$ arr=("foo" "bar baz")
$ set -- "${arr[@]}"
$ for f; do echo "$f"; done
foo
bar baz