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

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


person ssasa    schedule 24.03.2014    source источник
comment
Используйте кавычки: java Main "$PARAMS"   -  person anubhava    schedule 25.03.2014
comment
Я думаю, что это известная проблема со сценариями оболочки. Это может быть сложно исправить. Не могли бы вы передать файл вместо строк с пробелами?   -  person Giovanni Botta    schedule 25.03.2014
comment
java Main $PARAMS не работает. Он помещает весь вывод в одну строку.   -  person ssasa    schedule 25.03.2014
comment
@GiovanniBotta, проблема только со сценариями оболочки, которые не используют современные расширения (например, массивы).   -  person Charles Duffy    schedule 25.03.2014


Ответы (2)


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

java Main "$PARAM01" "$PARAM02"

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

PARAMS=("$PARAM01" "$PARAM02")
java Main "${PARAMS[@]}"
person John1024    schedule 24.03.2014
comment
Как я могу сделать это с вложенными переменными, такими как PARAMS (которые включают в себя другие переменные)? - person ssasa; 25.03.2014
comment
@ssasa с обычными переменными оболочки не сработает. Вы можете использовать массивы bash, как показано в обновленном ответе. - person John1024; 25.03.2014
comment
Это замечательно. Я даже могу вкладывать другие массивы с помощью PARAMS=(${PARAMS_A[@]} ${PARAMS_B[@]}) - person ssasa; 25.03.2014

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

person Lukino    schedule 24.03.2014