Bash:在if语句中使用diff的结果

Jar*_*ary 51 bash diff

我正在编写一个简单的Bash脚本来检测文件夹何时被修改.

它非常接近:

ls -lR $dir > a
ls -lR $dir > b

DIFF=$(diff a b) 
if [ $DIFF -ne 0 ] 
then
    echo "The directory was modified"
Run Code Online (Sandbox Code Playgroud)

不幸的是,if语句输出错误:[: - ne:一元运算符是预期的

我不确定我的剧本有什么问题,请有人帮助我吗?

非常感谢你!

Jary

Pau*_*lin 49

if ! diff -q a b &>/dev/null; then
  >&2 echo "different"
fi
Run Code Online (Sandbox Code Playgroud)

  • @JoshuaGoldberg bash的`if`操作与C不同.如果返回值为0则执行条件.检查`test`命令的手册页 - 如果为true则返回0,如果为false则返回1. (2认同)

Lou*_*nco 45

ls -lR $dir > a
ls -lR $dir > b

DIFF=$(diff a b) 
if [ "$DIFF" != "" ] 
then
    echo "The directory was modified"
fi
Run Code Online (Sandbox Code Playgroud)

  • 与使用`cmp`相反,这对**来说效率很低.`diff`是一个更慢,更昂贵的工具,当你想知道**究竟是什么差异**时,你只需要使用它,而不是是否有一个. (7认同)
  • diff具有退出状态,可以直接测试,而不使用另一个可执行文件'['. (4认同)
  • 答案值得一些关于比较退出代码与比较命令输出的解释。 (2认同)

tan*_*ens 27

您正在寻找示例代码中的返回值,diff而不是diff您正在使用的输出.

试试这个:

diff a b
if [ $? -ne 0 ]; then
    echo "The directory was modified";
fi
Run Code Online (Sandbox Code Playgroud)

  • 如果使用此方法,请在"diff"命令后立即进行测试.这很重要,因为$?包含LAST命令的返回码. (4认同)

Chr*_*eur 6

如果您不需要知道更改是什么,cmp就足够了。另外,您可以使用&&and提供的语法技巧||

cmp a b || echo 'The directory was modified'
Run Code Online (Sandbox Code Playgroud)

该指令可以解释为:“要么 a 和 b 相等,要么我回显消息”。

(语义的&&||必须小心处理,但在这里它的直观)。

只是为了可读性,我实际上更喜欢把它放在两行:

cmp a b \
  || echo 'The directory was modified'
Run Code Online (Sandbox Code Playgroud)