通过shell传递一个空格隔开的系统属性(Passing a space-separated Sys

2019-10-19 15:46发布

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

这类似于“ 通过shell脚本传递一个空格隔开的系统属性不起作用 ”,但不一样的。

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

Answer 1:

如果你把一个shell变量的命令行不带引号的 ,然后它经历了分词。 为了防止这种分词,英文双引号每个参数:

java Main "$PARAM01" "$PARAM02"

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

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


Answer 2:

或者你不能把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.insrc /主/资源那么它可以简化内部。



文章来源: Passing a space-separated System Property via a shell