2013-08-31 192 views
1

我有以下的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。 任何人都可以帮助我吗?

+0

它是你真正的代码,因为在这个例子中你正在执行'args'而不是'argList'。 – Pshemo

+0

@ user2699859:单引号转义$。 – Jayan

回答

3

创建壳要使用的参数扩展:

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 
+0

干得好!谢谢 – user2699859

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); 
1
ArrayList<String> argList = new ArrayList<>(); 
argList.add("echo"); 
argList.add("Hello"); 
argList.add("World"); 

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

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

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

1

回声将打印所有参数本身。在你的情况'$ 1 $ 2'被解释为正常字符串..因为它会反正打印所有的参数,你可以使用下面的一些东西。

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

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

echo [email protected] 
    echo $1 $2 
    #any such 

然后调用脚本......像

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

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