我有以下的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
。 有谁能够帮助我?
创建一个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而不是运行时(特别是引用等)