2012-05-30 89 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