If 语句对两个 cmp 结果给出“else”响应

If 语句对两个 cmp 结果给出“else”响应

我从以下方面得到了意想不到的结果

COMPARE(){
    if [ ! cmp $IPPATH/ip.old $IPPATH/ip.new >/dev/null 2>&1 ]; then
            echo compare going to create
            CREATE
    else
            echo same
    fi
}

我正在尝试比较文件,如果它们相同,则不执行任何操作(即 display same,但如果它们不相同,则显示compare going to create然后运行该CREATE函数。

但是,same当文件相同以及它们绝对不相同时,我会得到相同的“”结果。

这些显示正确(因为它们应该):

echo `cat $IPPATH/ip.old`
echo `cat $IPPATH/ip.new`

答案1

[测试中的字符意味着if您已告诉 shell 进行中记录的那种评估man test

它可能与该手册页不完全匹配,因为[它内置于大多数 shell,并且kshbashzsh可能实现略有不同的功能。

然而,这些没有做的一件事是运行外部的命令并测试结果。

所以我们可以用另一种方式做到这一点

例如,我们可以测试cmp命令的输出是否为非空白:

if [ -n "$(cmp $IPPATH/ip.old $IPPATH/ip.new)" ]
then
  echo different
else
  echo same
fi

或者我们可以调用cmp并测试返回代码,这更接近您的原始意图,只是不进行包装[...]

if ! cmp $IPPATH/ip.old $IPPATH/ip.new > /dev/null 2>&1
then
  echo different
else
  echo same
fi

相关内容