У меня возникли трудности с запуском java-программы из сценария оболочки (bash), где используются вложенные переменные. В основном существует множество системных и -D java-свойств, которые необходимо передать в java-программу. Я хотел бы организовать их лучше, один под другим, поскольку их очень трудно читать, когда в одной строке.
Это похоже на " Передача системного свойства, разделенного пробелом, с помощью сценария оболочки не работает ", но не то же самое.
Вот урезанный образец. Представьте себе такую программу java:
public class Main {
public static void main(String[] args) {
for (String s : args) {
System.out.println(s);
}
}
}
Вызывая это так:
java Main "First_Line" "Second line with spaces"
Он даст результат OK, как этот ответ:
First_Line Second line with spaces
Однако, если используется такой скрипт:
#!/bin/sh
PARAM01="FirstLine"
PARAM02="Second line with spaces"
PARAMS="$PARAM01 $PARAM02"
java Main $PARAMS
Затем все пространства съедаются, а второй параметр передается без кавычек в java. Результат выглядит следующим образом:
FirstLine Second line with spaces
Попробовали иначе котировать переменные в сценарии оболочки, но пока безуспешно. Как процитировать переменные оболочки так, чтобы пробелы сохранялись, а параметр передавался без изменений в java?
Если вы помещаете переменную оболочки в командной строке без кавычек, то она претерпевает расщепление слов. Чтобы предотвратить расщепление слов, сохраните каждый параметр в двойных кавычках:
java Main "$PARAM01" "$PARAM02"
Или, если вы хотите получить фантазию, используйте массив:
PARAMS=("$PARAM01" "$PARAM02")
java Main "${PARAMS[@]}"
Или вы не можете поместить params в отдельное имя файла для примера params.in и с помощью Java8 легко работать с
public static void main(final String[] args) throws IOException {
// Loading file (change with your way)
final Path file = Paths.get("src/main/resources/params.in");
// Printing lines or working with params
Files.lines(file).forEach(line -> {System.out.println(line);});
}
Изменение: небольшая ошибка, в случае, если params.in находится внутри src/main/resources, тогда это может быть упрощено.