Как я могу предоставить аргументы из значения переменной для команды в сценарии оболочки?

Я пытаюсь создать сценарий оболочки, в котором я хочу передать флаг -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

Что совершенно верно.

Почему это происходит? Это то, что я не могу предоставить аргументы команды из значения переменной?

2
задан 31 December 2017 в 18:09

1 ответ

В 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
3
ответ дан 31 December 2017 в 18:09

Другие вопросы по тегам:

Похожие вопросы: