【问题标题】:Passing a space-separated System Property via a shell通过 shell 传递以空格分隔的系统属性
【发布时间】:2014-05-02 09:54:04
【问题描述】:

我无法从使用嵌套变量的 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"

它会给出这样的响应:

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?

【问题讨论】:

  • 使用引号:java Main "$PARAMS"
  • 我认为这是 shell 脚本的一个已知问题。修复可能很棘手。你能传递一个文件而不是带空格的字符串吗?
  • java Main "$PARAMS" 不起作用。它将所有输出放在一行中。
  • @GiovanniBotta,只有不使用现代扩展(例如数组)的 shell 脚本存在问题。

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


【解决方案1】:

如果你在命令行中放置一个shell变量unquoted,那么它会经历分词。为防止分词,请将每个参数放在双引号中:

java Main "$PARAM01" "$PARAM02"

或者,如果您想变得花哨,请使用数组:

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

【讨论】:

  • 如何使用 PARAMS 等嵌套变量(包括其他变量)?
  • @ssasa 与普通的 shell 变量,它不会工作。您可以使用更新后的答案中所示的 bash 数组。
  • 这很棒。我什至可以用 PARAMS=("${PARAMS_A[@]}" "${PARAMS_B[@]}") 嵌套其他数组
【解决方案2】:

或者您不能将参数放入单独的文件名中,例如 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/main/resources 内,那么它可以被简化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多