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

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

Но если я повторяю ту же команду, я получаю: [ ! d3] $ 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 в 19:09

3 ответа

В 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
ответ дан 22 May 2018 в 15:50
  • 1
    Можно ли поместить значение classpath в двойные кавычки. Потому что пространство в любом месте классаpathpath сломает его. – Kashyap Kansara 31 December 2017 в 19:37
  • 2
    Пространства @ KashyapKansara не должны ломаться, если вы используете кавычки, как я показал - у вас есть конкретный пример, где это не так? – steeldriver 31 December 2017 в 19:50
  • 3
    @steeldriver Эй ... извините ... извините ... Он отлично работает с пробелами. Я только что проверил. Спасибо, что нашли время ответить на мой вопрос. – Kashyap Kansara 31 December 2017 в 20:04

В 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
ответ дан 18 July 2018 в 00:08

В 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
ответ дан 24 July 2018 в 17:09

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

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