我想测试是否有任何输出diff
(测试文件是否相同),如果没有echo "Passed $x" else echo "Failed $x"
。我想出了一些中间步骤(将 diff 的输出保存到文件然后从文件中读取)
diff "./helloworld$x.out" "./output/helloworld$x.out" > tmp.txt;
output="`cat tmp.txt`";
if [ "$output" = "" ];
then
echo "Passed $x";
else
echo "Failed $x";
fi;
我确信代码可以改进?主要问题是:是否可以将输出diff
直接保存到变量中?
答案1
这有效:
如果差异“。/helloworld$x.out”“。/output/helloworld$x.out”> / dev / null;那么 echo "已通过 $x"; 别的 echo "失败 $x"; 菲
如果您使用变量代替,则echo
可以删除else
分支:在之前将变量设置为 falseif
并保存 2 行代码。
如果您希望将结果实际放入变量中,请使用:
some_var="$(diff "./helloworld$x.out" "./output/helloworld$x.out")"
包括我的测试,看看它是否真的有效:
rinzwind@discworld:~$ 触摸 1 rinzwind@discworld:~$ touch 2 rinzwind@discworld:~$ 更多测试 如果 diff 1 2 >/dev/null; 那么 echo "已通过 $x"; 别的 echo "失败 $x"; 菲 rinzwind@discworld:~$ ./test 已通过 rinzwind@discworld:~$ vi 2 rinzwind@discworld:~$更多2 2 rinzwind@discworld:~$ ./test 失败的
在>/dev/null
部分上:>/dev/null 2>&1
将发送输出到>/dev/null
并且2>&1
将发送标准错误到&1
这个命令前面的同一个文件(意味着‘使用第一个参数’)(所以它也使用/dev/null
)。
旁注:sdiff
将显示并排diff
列表:
差异 1 2 1 1 2 2 3 3 4 4 5 5 7 7 > 8 9 9 10 10
答案2
diff
甚至可以使用下面的代码完全抑制输出,除了“文件 /bin/bash 和 /bin/sh 不同”消息。
file1="./helloworld$x.out"
file2="./output/helloworld$x.out"
if diff -q "$file1" "$file2"; then
echo "Passed $x"
else
echo "Failed $x"
fi
如果您甚至想隐藏该消息,则必须> /dev/null
在 diff 命令后附加以隐藏输出diff
:
if diff -q "$file1" "$file2" >/dev/null; then
/dev/null
是一个充当黑洞的特殊文件,如果您写入它,它就会消失,如果您读取它,您将不会得到任何结果。
请注意,bash 不需要;
结束行。
至于原始问题,将程序的输出保存在变量中:
file1="./helloworld$x.out"
file2="./output/helloworld$x.out"
output="$(diff -q "$file1" "$file2")"
# the quotes are mandatory, this checks whether $output is empty or not
if [ -n "$output" ]; then
echo "Passed $x"
else
echo "Failed $x"
fi
检查变量是否为空的其他方法:
[ "$output" = "" ]
[ "$output" == "" ]
[[ "$output" == "" ]]
[[ $output == "" ]]
如果您使用 Bash,建议使用最后两个命令进行字符串比较。否则,[ -n "$output" ]
建议使用第一个 and。
答案3
a) 可以使用以下命令捕获 command1 的输出
output=$(diff "helloworld$x.out" "output/helloworld$x.out")
或者使用反引号,但不鼓励使用它们,因为您无法嵌套它们,并且它们可能很难与撇号区分开来,具体取决于字体:
output=`cmd1`
b)您可以直接使用管道,而不是先写入文件,然后读取该文件(或抓取输出,然后回显它):
cmd1 > file
cat file | cmd2
output=$(cmd1)
echo "${output}" | cmd2
=>
cmd1 | cmd2
但是在您的示例中,您感兴趣的不是输出,而是程序的结果 - 它有效吗?
diff "helloworld$x.out" "output/helloworld$x.out" && echo "success" || echo "failure"
要了解有关 && 和 || 的使用,请搜索“快捷方式 AND 和快捷方式 OR”。
为了保持输出干净,你可以将“diff”的输出重定向到无处:
diff "helloworld$x.out" "output/helloworld$x.out" >/dev/null && echo "success" || echo "failure"
为了获取成功并在稍后进行评估,可以使用 $? 将最后一个命令的结果存储在变量中:
diff "helloworld$x.out" "output/helloworld$x.out" >/dev/null
result=$?
# do something else
case $result in
0) echo success ;;
*) echo failure ;;
esac
答案4
如果你想知道两个文件是否相同或不同(但不关心实际上有什么不同),cmp
则更合适。
if cmp -s file1 file2; then echo "Equal"; else echo "Not equal"; fi