我很难从使用嵌套变量的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?
答案 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 中,那么它可以简化。