Передача системного свойства через пробел через оболочку

1

У меня возникли трудности с запуском 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?

Теги:
command-line-arguments
jvm-arguments

2 ответа

6
Лучший ответ

Если вы помещаете переменную оболочки в командной строке без кавычек, то она претерпевает расщепление слов. Чтобы предотвратить расщепление слов, сохраните каждый параметр в двойных кавычках:

java Main "$PARAM01" "$PARAM02"

Или, если вы хотите получить фантазию, используйте массив:

PARAMS=("$PARAM01" "$PARAM02")
java Main "${PARAMS[@]}"
  • 0
    Как я могу сделать это с вложенными переменными, такими как PARAMS (который включает в себя другие переменные)?
  • 0
    @ssasa с обычными переменными оболочки, это не сработает. Вы можете использовать массивы bash, как показано в обновленном ответе.
Показать ещё 1 комментарий
0

Или вы не можете поместить 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, тогда это может быть упрощено.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню