通过shell传递空格分隔的系统属性

时间:2014-03-24 20:10:59

标签: java bash shell command-line-arguments jvm-arguments

我很难从使用嵌套变量的shell脚本(bash)启动java程序。基本上有许多系统和-D java属性需要传递给java程序。我想以一种更好的方式组织它们,因为它们在一行中很难阅读。

这类似于 " Passing a space-separated System Property via a shell script doesn't work"但不一样。

这是一个剥离的样本。想象一下像这样的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

尝试在shell脚本中引用不同的变量,但到目前为止还没有成功。如何引用shell变量以保留空格并将参数完整地传递给java?

2 个答案:

答案 0 :(得分:6)

如果在命令行未加引号上放置shell变量,则会进行单词拆分。要防止该分词,请将每个参数保留为双引号:

java Main "$PARAM01" "$PARAM02"

或者,如果你想获得幻想,请使用数组:

PARAMS=("$PARAM01" "$PARAM02")
java Main "${PARAMS[@]}"

答案 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 中,那么它可以简化。