“here”shell脚本调用java类

时间:2014-02-14 06:29:48

标签: java bash

我正在编写一个非常简单的“here”shell文档,它提供了一个java类。这是java代码

public class input {
    public static void main(String[] args)
    {
      try {
        do  {
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
                System.out.print("cmd>");
                String s = br.readLine();
                if (s != null) {
                   System.out.println("cmd=" + s);
                   if (s.equals("quit")) return;
                }
        } while (true);
      }
      catch(Exception e) {
      }
    }
}

它只是读取输入并回复它:)

在文件“readinput”中,我有一行来调用上面的java类

java input  

这是shell脚本,用一个接一个地调用上面的“readinput”

#!/bin/sh
./readinput << EOF1 
aaaaaaaaaa
bbbbbbbb
quit
EOF1

当我运行这个shell脚本时,第一行“aaaaaaaaa”被正确回显,然后脚本进入无限循环。好像java类一直在读取空字符串。

可能导致此行为的原因是什么?

2 个答案:

答案 0 :(得分:1)

代码应修改如下, if 循环应修改。

public class input {
    public static void main(String[] args)
    {
      try {
        InputStreamReader isr = new InputStreamReader(System.in);
        BufferedReader br = new BufferedReader(isr);
                System.out.print("cmd>");
                String s = null;
                while ((s = br.readLine() )!= null) {
                   System.out.println("cmd=" + s);
                   if (s.equals("quit")) return;
                }
      }
      catch(Exception e) {
      }
    }
}

虽然外部不需要循环,但循环应仅用于读取shell文件的内容。
这里读者将首先阅读内容,而将遍历内容。

答案 1 :(得分:0)

您的Java类正在循环内为每一行输入创建InputStreamReader。当你每次只读取输入行然后继续读取null时创建一个新的InputStreamReader

do loop之前移动它们以解决此问题。

  try {
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader br = new BufferedReader(isr);
    do  {
            System.out.println("<cmd>");
            String s = br.readLine();
            if (s != null) {
               System.out.println("cmd=" + s);
               if (s.equals("quit")) return;
            }
    } while (true);
    isr.close();
  }
  catch(Exception e) {
     System.err.println("Exception: " + e);
  }