2

入力を読み取るシェルスクリプトがあります

#!/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 コンソールで出力を確認できます

確認したい年(4 桁)を入力し、[ENTER] を押します。

変数の「年」をどのように読み取ることができるか、私のスクリプトのシェルスクリプトに値を渡す方法の実際の問題


提案に従ってコードを編集しましたが、修正した場所では機能しません

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!");
4

5 に答える 5

6

クラスのOutputStreamを使用できます。Process

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

pw.println("1997");

この出力ストリームに書き込む内容は、シェル スクリプトの入力ストリームになります。したがって、変数read yearに 1987 が読み込まれます。year

編集:

私もそれを試してみましたが、問題を見つけることができました。1997 年の文字列はスクリプトに到達していません。これは、スクリプトPrintWriterに書き込まれたデータがバッファリングされているためです。withのPrintWriter後にストリームをフラッシュするか、作成時にauto-flush プロパティを設定する必要があります。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

テスト.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!
于 2012-05-30T06:32:33.360 に答える
3

スクリプトを実行するJavaプログラムからスクリプトに値を渡すには、コマンドライン引数を使用します。スクリプトからJavaプログラムに情報を送り返したい場合は、スクリプトに値を出力し、JavaプログラムでスクリプトのSTDOUTを読み取って解析します。

あなたは本当にほとんどそこにいます。これで、スクリプト出力を(whileループに)読み取っていますが、印刷しているだけです。出力を解析し、必要な処理を実行します。

于 2012-05-30T06:28:00.523 に答える
1

入力ストリームを解析する必要があると考えるのは、値を抽出することです。行ごとに解析します。

于 2012-05-30T06:28:19.687 に答える
1

Java プログラムからプロセスにデータを書き込めるように、getOutputStreamを使用して OutputStream をセットアップする必要もあります。

public abstract OutputStream getOutputStream()

サブプロセスの出力ストリームを取得します。ストリームへの出力は、この Process オブジェクトによって表されるプロセスの標準入力ストリームにパイプされます。

于 2012-05-30T06:31:27.573 に答える
0

これでうまくいくと思います。サブプロセスの出力ストリームを処理する必要があります。ドキュメントを読んでください。

 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
 bw.write("2012");
于 2012-05-30T06:30:32.100 に答える