如何将多个整数从Bash shell脚本传递到Java System.in



我需要将Bash shell脚本中的两个整数传递给我的Java程序。

这是我的Java代码。

import java.util.Scanner;
public class ConsoleApp {
public static void main(String[] args) {
int x = getInt();
int y = getInt();
System.out.println("x = " + x);
System.out.println("y = " + y);
}
private static int getInt() {
Scanner s = new Scanner(System.in);
return s.nextInt();
}
}

这里是Bash脚本,脚本的名称是run.sh

#!/usr/bin/env bash
declare -r AppName=ConsoleApp
function compile() {
javac $AppName.java
}
function execute() {
echo 1 2 | java $AppName
}
compile; execute;
$ chmod a+x run.sh
$ ./run.sh

执行后,会出现以下错误消息。

Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Scanner.java:937)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at ConsoleApp.getInt(ConsoleApp.java:13)
at ConsoleApp.main(ConsoleApp.java:6)

目前,我知道它可以读取第一个整数x,但不能读取第二个整数y

您必须对两个数字使用相同的扫描仪:

Scanner s = new Scanner(System.in);
int x = s.nextInt();
int y = s.nextInt();
System.out.println("x = " + x);
System.out.println("y = " + y);

否则,第一扫描器将消耗来自System.in的比第一数字更多的数据,并且将剩余数据存储在内部缓冲器中以供进一步处理。如果您随后切换到另一个扫描仪,则数据将丢失,新扫描仪将再次从System.in读取,但已所剩无几。

或者,通过args参数将这两个数字作为命令行参数传递可能更容易。

创建单个Scanner

import java.util.Scanner;
public class ConsoleApp {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int x = getInt(s);
int y = getInt(s);
System.out.println("x = " + x);
System.out.println("y = " + y);
}
private static int getInt(Scanner s) {
return s.nextInt();
}
}

在Bash脚本中使用heredoc。

#!/usr/bin/env bash
declare -r AppName=ConsoleApp
function compile() {
javac $AppName.java
}
function execute() {
java $AppName <<EOF
1 2
EOF
}
compile; execute;

最新更新