我有一个可执行文件,我将使用所有输入文件进行测试并生成相应数量的输出文件(我可以完成这部分)。然后,我将比较新创建的文件(名为 mytestN.out)与具有正确输出的文件(名为 testN.out),并将其通过管道传输到名为 difftestN.txt 的文件中。然后我将检查每个 difftest.txt ,如果它为空,则打印“成功”,如果不为空,则打印“发现差异”。
例如,我会做
./Executable < test1.in > mytest1.out
对于 N 个 test.in。我发现这可以用这个来完成
for f in test*.in; do ./tetris <"$f" >"my${f%in}svg"; done
然后我将对所有 mytest.out 和所有 test.out 执行 diff 命令。
diff mytest1.out test1.out > difftest1.txt
我不确定如何对所有 testN 执行此操作。我认为这是正确的做法:
for f in mytest*.svg; do diff "$f" "###what goes here?###" > "diff${f%in}txt"; done
但我不知道“$f”之后会发生什么,并且差异将通过管道传输到 diffmytestN.txt 中,但我想要 difftestN.txt
然后,我想检查每个 difftest.txt,如果它为空,则打印“成功”,如果它不为空,则打印“发现差异”
答案1
您可以针对您提到的任意大量文件进行调整。以下是我使用的 4 个测试文件的内容: test1: 1 mytest1: 1 test2: 2 mytest2: 2
for i in {1..2}; do
diff test${i}.out mytest${i}.out &>/dev/null
es=$?
if [ $es -ne 0 ]; then
echo "difference found"
else
echo "success"
fi
done
输出:
difference found
success
我意识到我没有回答您的字面问题,因为您要求保存 diff 输出的文件。如果您确实必须这样做,您可以更改代码:
diff test${i}.out mytest${i}.out > difftest${i}.txt
if ! [[ -s difftest${i} ]]; then
echo success
else
echo "difference found"
fi
记住这一点可能很有用,如果您的程序尝试将包含内容的文件与不存在的文件进行比较,它会创建到 stderr 的输出,看起来好像该文件与不存在的文件之间存在实质性差异文件。这应该没问题,因为只有 stdout 进入 *.txt。