从Java运行linux脚本

我有以下的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 。 有谁能够帮助我?

Solutions Collecting From Web of "从Java运行linux脚本"

创建一个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 

您应该使用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); 
 ArrayList<String> argList = new ArrayList<>(); argList.add("echo"); argList.add("Hello"); argList.add("World"); Process p =Runtime.getRuntime().exec(args); 

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

如果你想使用$那么你将不得不编写一个shell脚本。

回声将打印所有参数。 在你的情况'$ 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而不是运行时(特别是引用等)