"here"调用 Java 类的 shell 脚本



我正在编写一个非常简单的"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 脚本时,第一行"aaaaa"被正确回显,然后脚本进入无限循环。似乎 java 类一直在读取空字符串。

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

代码应该修改如下,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 文件的内容。
在这里,读者将首先阅读内容,While 将遍历内容。

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

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);
  }

最新更新