我正在编写一个测试脚本。它使用作为输入传递的* .in文件执行程序,并使用 diff 命令将其输出与* .out文件进行比较。
但是,我不想打印 diff 输出,但要检查是否有,如果是,请将* .in文件名添加到失败测试列表中。< / p>
问题是我不知道如何检查命令是否产生输出而不打印它。
我的脚本现在:
failed_tests=""
for filename in $directory/*.in; do
command=< ${filename} ./${program} | diff - ${filename%.in}.out
# Check if command produces output.
if command; then
# Add filename to failed tests list.
failed_tests="${failed_tests} ${filename}"
fi
done
echo $failed_tests
提前感谢您的所有答案。
答案 0 :(得分:1)
diff
的退出状态为0,否则为非零。您可以使用-q
选项来取消大部分输出,并将其余部分重定向到/dev/null
。然后,if
语句可以直接测试退出状态。
# Also, use an array to store a list of filenames
failed_tests=()
for filename in "$directory"/*.in; do
if ./"$program" "$filename" | diff -q - "${filename%.in}.out" > /dev/null; then
failed_tests+=( "$filename" )
fi
done
答案 1 :(得分:1)
你的方法是可行的,但是你必须在``或$()
中捕获$命令,同时,$ filename应该作为输入但不重定向其内容。在旁注中,您可能想要删除变量中的花括号,只要相邻的字符不是分隔符,它就应该工作。 _
command=$(./$program $filename | diff - -q $filename%.in.out)
diff中的 -q
选项表示仅在.out不同时报告。不带方括号的if
仅适用于具有退出状态的程序或命令。例如grep
if [[ -n $command ]]; then
# Add filename to failed tests list.
failed_tests="$failed_tests $filename"
fi
-n
选项表示不为空
最后,循环之外的相同方法:
if [[ -n $failed_tests ]]; then
#do something here
fi
答案 2 :(得分:0)
您可以使用
对diff -q
的输出做出反应
if [ -n "$(diff -q file1 file2)" ]; then
echo different
fi
您想比较您的编程的输出,这可能与流程替换:
if [ -n "$(diff -q $(command "${filename}") file2)" ]; then
echo different
fi
答案 3 :(得分:-1)
要从命令获取输出,您可以使用variable=$`command`
或
int age;
cin >> age;
然后你可以对变量内容使用一些简单的条件。