我有以下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
。
有人能帮助我吗?
答案 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。(特别是对于引用等)