Bash:如何将这 2 个 if 语句压缩为一个

Bash : how to squeeze these 2 if statements into one

我是 Bash 和脚本编写的新手,我想找出一种方法将这两个语句组合成 1 。这个脚本的作用是检查两个文件 D1 和 D2 是否是同一个文件,如果不是则检查它们的内容是否相同。

if [ ! $D1 -ef $D2 ]

 then
    echo not the same file
        if  cmp -s $D1 $D2  

           then
            echo same info
           else
                echo not same info
        fi

    else
            echo same file


fi

除此之外,我也很困惑什么时候使用[]什么时候跳过它们,手册上说什么时候有条件使用[],但那是什么意思?

谢谢。

if 语句的语法是(来自 2.10 Shell Grammar):

if_clause        : If compound_list Then compound_list else_part Fi
                 | If compound_list Then compound_list           Fi

其中 compound_list 最终归结为一个命令。

! $D1 -ef $D2 不是命令。

[ 是一个命令(也称为 test)。请参阅 type [type test 以及 which [which test.

的输出

因此 [ ! $D1 -ef $D2 ]if 语句中使用的有效命令。

compound_list 的 return 值是 if 测试的值。

因此,当您使用 cmp(或任何其他命令)之类的东西时,没有理由使用 [,事实上,使用 [ 是不正确的。

因为 compound_list 可以是多个命令来组合 [ ! $D1 -ef $D2 ]cmp -s $D1 $D2,只需照常使用 &&。 (也需要 cmp 调用上的 ! 来反转它以从两者获得 "not same" 测试。)

if [ ! "$D1" -ef "$D2" ] && ! cmp -s "$D1" "$D2"; then
    echo 'Not same file or same contents'
fi