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

ssa*_*asa 1 java bash shell jvm-arguments command-line-arguments

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

这类似于" 通过shell脚本传递空格分隔的系统属性不起作用 "但不相同.

这是一个精简的样本.想象一下像这样的java程序:

public class Main {
    public static void main(String[] args) {
        for (String s : args) {
            System.out.println(s);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当像这样调用它时:

java Main "First_Line" "Second line with spaces"

它会像这样的响应给出OK结果:

First_Line
Second line with spaces
Run Code Online (Sandbox Code Playgroud)

但是,如果使用这样的脚本:

#!/bin/sh
PARAM01="FirstLine"
PARAM02="Second line with spaces"
PARAMS="$PARAM01 $PARAM02"
java Main $PARAMS
Run Code Online (Sandbox Code Playgroud)

然后吃掉所有空格,第二个参数不加引号传递给java.结果如下所示:

FirstLine
Second
line
with
spaces
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*024 6

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

java Main "$PARAM01" "$PARAM02"
Run Code Online (Sandbox Code Playgroud)

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

PARAMS=("$PARAM01" "$PARAM02")
java Main "${PARAMS[@]}"
Run Code Online (Sandbox Code Playgroud)