2013-08-31 239 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而不是運行時(尤其是引用等)