从Java运行linux脚本

时间:2013-08-31 07:58:01

标签: java linux bash exec

我有以下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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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);

答案 2 :(得分:1)

ArrayList<String> argList = new ArrayList<>();
argList.add("echo");
argList.add("Hello");
argList.add("World");

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

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

如果您想使用$,则必须编写shell脚本。

答案 3 :(得分:1)

Echo将打印所有参数。在您的情况下,$ 1 $ 2&#39;被解释为正常的字符串..因为无论如何它将打印所有的args你可以使用下面的东西。

  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而不是Runtime。(特别是对于引用等)