【问题标题】:Passing arguments form java program to bash script that call another java programa with the arguments将参数从 java 程序传递到 bash 脚本,该脚本使用参数调用另一个 java 程序
【发布时间】:2011-05-12 09:49:32
【问题描述】:

我想在我的 java 程序中执行一个 shell 脚本,并传递如下所示的参数:

Runtime.getRuntime().exec("./test.sh " + "\\\"param1\\\"\\\"param2\\\"\\\"param3\\\"");

并且 test.sh 将调用另一个传递字符串参数的 java 程序,如下所示:

another.jar \"param1\"\"param2\"\"param3\"

最后 anther.jar 程序会以这种格式解释参数

another.jar "param1""param2""param3"

我对此有点困惑,因为在这种情况下我无法正确处理转义字符..kkk

我在第一个命令中尝试了一些字符串格式,但没有得到正确的格式。

一些帮助会很好!

谢谢!

【问题讨论】:

  • 为什么你需要在你的论点周围加上引号?目标 .jar 是否需要在其参数周围加上引号?

标签: java bash parameters arguments escaping


【解决方案1】:

使用ProcessBuilder。不需要对这些参数做任何特别的事情,它们会慢慢流过。

//ProcessBuilder pb = new ProcessBuilder("test.sh", "param1", "param2", "param3");
ProcessBuilder pb = new ProcessBuilder("test.sh", "param1 " + "param2 " + "param3");
pb.start();

在 test.sh 中:

java -jar program2 $1 # Or however you want to call it.

在program2.java中

public static void main(String[] args)
{
   System.out.println(args[0]);
}

【讨论】:

  • 非常感谢乔纳森。但我无法改变 sh 程序或其他 java 应用程序接收参数的方式。只有一个参数应该被转移。谢谢
  • @Bera 我更新了答案——如果你如图所示尝试会发生什么?我希望它将参数作为单个参数发送。
【解决方案2】:

我认为您最好使用exec(String[] cmdarray) 而不是exec(String cmd)。这是因为exec(String cmd) 通过StringTokenizer 对参数进行标记,在分解命令行参数时根本不注意双引号。

试试这样的:

ArrayList<String> argList = new ArrayList<String>();
argList.add("param1");
argList.add("param2");
argList.add("param2");
String[] args = argList.toArray(new String[argList.size()]);
Runtime.getRuntime().exec("mycommand", args);

参数值中的字符不应需要引用或转义,除非 Java 源代码字符串文字可能需要转义。

【讨论】:

  • 我需要将命令与字符串中的参数一起传递......但我很欣赏你的建议,迈克!谢谢!
  • 我明白了! "./command.sh \"\"" + "\\\\\\\"param_1\\\\\\\"" + "\\\\\\\"param_2\\\\\\\" " + "\"\"";
猜你喜欢
  • 2013-11-05
  • 1970-01-01
  • 2021-07-11
  • 2021-02-12
  • 1970-01-01
  • 2014-10-04
  • 2011-06-13
  • 2013-08-27
  • 2012-04-28
相关资源
最近更新 更多