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

标签 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?

最佳答案

如果您在命令行中放置一个 shell 变量未加引号,那么它会进行分词。为防止单词拆分,请将每个参数放在双引号中:

java Main "$PARAM01" "$PARAM02"

或者,如果你想花哨点,使用数组:

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

关于java - 通过 shell 传递以空格分隔的系统属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22619615/

相关文章:

java - Android 将字符串解析为日期 - 未知模式字符 'X'

bash - 为什么我的 setuid root bash shell 脚本不起作用?

bash - 为已知 PID 的不同进程在 bash 中设置陷阱

Bash -- 如何执行语法 : ./myscript.sh *.dat?

linux - 运行命令而不让我等待

java - Akka Java - 即时创建递归子 Actor ?

java - 从 ReactJS 访问 REST 服务时出现 CORS 问题

linux - 如何在同一目录中复制文件名已更改的文件

linux - 使用 shell 脚本获取多行 XML 中的标签值

java - Android SpongyCaSTLe ECDH secp384r1 key 大小不正确