You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

错误原因分析

  1. 变量未正确赋值:你把wc的结果写入了文件a,但从未将文件内容读取到变量a中,导致$a为空值。在[ $a == 0 ]中,空值会让表达式变成[ == 0 ],不符合test命令语法,触发“一元运算符期望”错误。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 19:15:58