1

我有以下java代码

ArrayList<String> argList = new ArrayList<>();
argList.add("Hello");
argList.add("World");
String[] args = argList.toArray(new String[argList.size()]);

Process p =Runtime.getRuntime().exec("echo '$1 $2' ", args);

结果是$1 $2,但我想打印Hello World。有谁能够帮我?

4

4 回答 4

3

创建一个shell来使用参数扩展:

ArrayList<String> command = new ArrayList<>();
command.add("bash");
command.add("-c");
command.add("echo \"$0\" \"$1\"");
command.addAll(argList);

Process p = Runtime.getRuntime().exec(command.toArray(new String[1]));

输出:

Hello World
于 2013-08-31T08:15:31.477 回答
1

您应该使用该exec(String[] args)方法,而不是:

    String[] cmdArgs = { "echo", "Hello", "World!" };
    Process process = Runtime.getRuntime().exec(cmdArgs);
    BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line = null;
    while ((line = in.readLine()) != null) {
        System.out.println(line);
    }

问题是,exec()方法中的第一个参数不是脚本,而是脚本的名称。

如果你想使用变量,就像$1$2应该在你的脚本中那样做。

所以,你真正想要的是:

    String[] cmdArgs = { "myscript", "Hello", "World!" };
    Process process = Runtime.getRuntime().exec(cmdArgs);
于 2013-08-31T08:07:50.027 回答
1
ArrayList<String> argList = new ArrayList<>();
argList.add("echo");
argList.add("Hello");
argList.add("World");

Process p =Runtime.getRuntime().exec(args);

这样,String[]将作为参数传递给echo.

如果要使用$,则必须编写一个 shell 脚本。

于 2013-08-31T08:15:12.947 回答
1

Echo 将打印所有参数。在您的情况下,'$1 $2' 被解释为普通字符串。因为它无论如何都会打印所有参数,您可以使用如下所示的内容。

  ProcessBuilder pb= new ProcessBuilder().command("/bin/echo.exe", "hello", "world\n");

mycommands.sh 另一种选择是共同创建一个带有适当内容的小脚本

   echo $@ 
   echo $1 $2  
   #any such

然后你调用你的脚本......就像

  ProcessBuilder pb= new ProcessBuilder().command("/bin/bash" , "-c", "<path to script > ", "hello", "world\n");

注意 ProcessBuilder 的使用。这是一个改进的 api 而不是运行时。(尤其是引用等)

于 2013-08-31T09:01:53.000 回答