如何在Unix Shell脚本中检查diff命令执行是否成功
在Shell脚本中通过if判断diff执行结果的问题
你的Abc.sh脚本试图通过统计diff输出文件的行数判断两个文件是否一致,但运行时出现[: ==: unary operator expected错误,且错误执行了else分支。脚本及运行输出如下:
示例脚本Abc.sh
#!/bin/bash cd users diff s1 d1 > a.txt wc -l a.txt | awk '{print f1}' > a echo "value of a is" cat a if [ $a == 0 ] then echo "checksums match" else echo "checksums do not match" fi
运行输出
value of a is 0 [: ==: unary operator expected checksums do not match
错误原因分析
- 变量未正确赋值:你把wc的结果写入了文件
a,但从未将文件内容读取到变量a中,导致$a为空值。在[ $a == 0 ]中,空值会让表达式变成[ == 0 ],不符合test命令语法,触发“一元运算符期望”错误。 - awk语法错误:awk中取第一列需要用
$1,而非f1,这导致你写入文件a的内容其实是空的(虽然运行输出显示0,可能是测试环境的特殊情况,但语法本身错误)。
两种解决方法
方法一:直接利用diff的退出状态码(推荐)
diff命令自带明确的退出状态码,完全不需要统计行数:
- 0:两个文件内容完全一致
- 1:文件内容存在差异
- 2:发生错误(如文件不存在、权限不足)
脚本可以简化为:
#!/bin/bash cd users # 重定向输出到/dev/null,避免diff的输出干扰脚本结果 if diff s1 d1 > /dev/null 2>&1; then echo "checksums match" else exit_code=$? if [ $exit_code -eq 1 ]; then echo "checksums do not match" else echo "Error occurred when comparing files" exit $exit_code fi fi
方法二:修复原脚本的问题
如果坚持要用统计行数的方式,需修正两处错误:
#!/bin/bash cd users diff s1 d1 > a.txt # 用命令替换直接将结果赋值给变量,无需中间文件;修正awk的$1语法 a=$(wc -l a.txt | awk '{print $1}') echo "value of a is $a" # 用双引号包裹变量防止空值报错,用-eq做数值比较(更严谨) if [ "$a" -eq 0 ]; then echo "checksums match" else echo "checksums do not match" fi
内容的提问来源于stack exchange,提问作者melony_r
相关产品推荐
相关产品推荐

