我有一个shell脚本读取输入
#!/bin/bash
echo "Type the year that you want to check (4 digits), followed by [ENTER]:"
read year
echo $year
我执行使用Java API的这个shell脚本
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控制台我可以看到输出
键入要检查(4位)的年,然后按[ENTER]:
现在如何将值传递给我的脚本中的shell脚本实际的问题是如何在varialble“年”可以读
我已编辑的代码为每建议,但不工作,我们纠正
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!");
要通过从执行脚本的脚本中使用命令行参数的Java程序的值。 如果您要发送信息,从脚本到java程序后面打印脚本中的值,读剧本的STDOUT在java程序和解析它。
你真的几乎没有。 现在你正在阅读的脚本输出(入while循环),但你只是打印出来。 解析输出,并做你需要做什么用。
您可以使用OutputStream
中的Process
类:
OutputStream os = process.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.println("1997");
你写的输出流会变成什么样的shell脚本的输入流。 所以, read year
会读1987年的year
变量。
编辑:
我也尝试过了,我已经成功地发现问题。 1997年的弦还没有达到脚本,怎么一回事,因为PrintWriter
缓冲已写入的数据。 您可能已冲洗PrintWriter
后流println()
与pw.flush()
或你有自动冲洗属性设置为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!
想你应该分析输入流中提取你的价值观。 通过线解析它。
你想使用建立一个OutputStream 的getOutputStream藏汉,要能够从Java程序将数据写入过程。
公共抽象的OutputStream的getOutputStream()
获得子进程的输出流。 输出到流管道输送到由该Process对象所表示的过程的标准输入流。
我想,这应该工作。 你需要处理你的子进程输出流。 阅读文档 。
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
bw.write("2012");