2012-05-30 87 views
2

我有一個shell腳本讀取執行從Java,Shell腳本Shell腳本已經閱讀操作

#!/bin/bash 
echo "Type the year that you want to check (4 digits), followed by [ENTER]:" 
read year 
echo $year 

我使用的Java API

ProcessBuilder pb = new ProcessBuilder("/bin/bash", "/junk/leaptest.sh"); 
final Process process = pb.start(); 

InputStream is = process.getInputStream(); 
InputStreamReader isr = new InputStreamReader(is); 
BufferedReader br = new BufferedReader(isr); 
String line; 


while ((line = br.readLine()) != null) { 
    System.out.println(line);  
} 
System.out.println("Program terminated!"); 

在Java執行這個shell腳本的輸入控制檯我可以看到輸出

類型要檢查(4位)的年,然後按[ENTER]:

現在如何將值傳遞給我的腳本中的shell腳本實際的問題是如何在varialble「年」可以讀


我已編輯的代碼爲每建議,但沒有按」 t工作在那裏我們糾正它

ProcessBuilder pb = new ProcessBuilder("/bin/bash", "-c", "/junk/leaptest.sh"); 
final Process process = pb.start(); 
InputStream is = process.getInputStream(); 
InputStreamReader isr = new InputStreamReader(is); 
BufferedReader br = new BufferedReader(isr); 
String line; 
/* 
* OutputStream os = process.getOutputStream(); PrintWriter pw = new 
* PrintWriter(os); 
*/ 

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); 
while ((line = br.readLine()) != null) { 
    System.out.println(line); 
    // pw.println("8999"); 
    bw.write("2012"); 
} 
System.out.println("Program terminated!"); 

回答

3

要從java程序執行腳本的值傳遞給腳本使用命令行參數。如果您想從腳本發回信息到java程序,請在腳本中輸出值,然後在java程序中讀取腳本的STDOUT並解析它。

你真的快到了。現在你正在閱讀腳本輸出(進入while循環),但你只是在打印它。解析輸出並根據需要做你需要的。

+0

感謝Alexr解析輸出意味着什麼?如何獲得此 – anish

1

認爲你應該解析輸入流是提取你的值。按行解析。

+0

謝謝alexey,如何解析輸入流,可以指導我在此 – anish

0

我認爲這應該工作。你需要處理你的子進程的輸出流。閱讀docs

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); 
bw.write("2012"); 
1

你想用藏漢getOutputStream,要能夠從Java程序將數據寫入過程中建立的OutputStream。

公共抽象的OutputStream的getOutputStream()

獲得子的輸出流。輸出到流是通過管道輸入到此過程對象 表示的過程的標準輸入流中。

6

您可以使用該Process類的OutputStream

OutputStream os = process.getOutputStream(); 
PrintWriter pw = new PrintWriter(os); 

pw.println("1997"); 

寫入此輸出流會變成什麼shell腳本的輸入流。因此read year將讀取1987到year變量。

編輯:

我也嘗試過了,我已經成功地發現問題。 1997字符串未到腳本,因爲PrintWriter緩存了寫入它的數據。你要麼必須沖洗println()pw.flush()PrintWriter流,或者你有在創建時自動刷新屬性設置爲true

PrintWriter pw = new PrintWriter(os, true); 

這裏是正在爲我好完整代碼:

leaptest.sh:

#!/bin/bash 
echo "Type the year that you want to check (4 digits), followed by [ENTER]:" 
read year 
echo $year 

Test.java:

import java.io.*; 

class Test { 

    public static void main(String[] args) { 
     try { 
      ProcessBuilder pb = new ProcessBuilder("/bin/bash", "leaptest.sh"); 
      final Process process = pb.start(); 

      BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); 
      PrintWriter pw = new PrintWriter(process.getOutputStream()); 
      String line; 

      while ((line = br.readLine()) != null) { 
       System.out.println(line); 
       pw.println("1997"); 
       pw.flush(); 
      } 
      System.out.println("Program terminated!"); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

輸出:

$ java Test 
Type the year that you want to check (4 digits), followed by [ENTER]: 
1997 
Program terminated! 
+0

感謝buc任何現場代碼想分享,我;米錯過了那部分 – anish

+0

@anish:我發現了錯誤,並更新了我的答案以一個工作的例子。 – buc

+0

非常感謝,它的工作完美 – anish