作为一名JAVA助教,我对很多学生的实验室进行了评分。许多这些实验室使用扫描仪来获取用户的输入。有没有一种方法可以利用heredoc运行所有具有相同输入参数的实验室,而无需更改学生的代码?到目前为止我所拥有的(除了heredoc-esque代码之外的其他代码):
#!/bin/bash
for i in unzip/*; do
echo $i
javac $i/lab0/AddThree.java
cd $i/lab0
java AddThree <<EOF
2
3
4
EOF
cd ../../..
done
我尝试评分的代码添加了用户提供的三个整数。 unzip是每个学生都有一个文件夹的目录(即文件结构是./unzip/student/lab0/sourcecode.java)
Java给出:
unzip/student
Hello out there
I will add three numbers for you
Enter three whole numbers on a line :
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:909)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextInt(Scanner.java:2160)
at java.util.Scanner.nextInt(Scanner.java:2119)
at AddThree.main(AddThree.java:10)
./lab0test: line 9: 2: command not found
./lab0test: line 10: 3: command not found
./lab0test: line 11: 4: command not found
./lab0test: line 12: EOF: command not found
答案 0 :(得分:4)
你的heredoc看起来不错,除了它会在每一行的开头发送空格。要摆脱这些,您可以使用-EOF
并使用 Tab 字符开始heredoc的每一行,这些字符将被剥离:
cd $i/lab0
java AddThree <<-EOF
TabTab2
TabTab3
TabTab4
TabTabEOF
cd ../../..
或者取消heredoc的内容。它很难看,但它会起作用。
cd $i/lab0
java AddThree <<EOF
2
3
4
EOF
cd ../../..
或者,如果输入足够短,则可以内联:
java AddThree <<< $'2\n3\n4'
(使用$'...'
告诉shell解释\n
转义序列。)