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

我正在编写一个简单的 Bash 脚本来检测文件夹是否被修改。

这种情况非常接近:

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


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

遗憾的是,if 语句输出一个错误: [ :-ne: unary 操作符预期

我不知道我的剧本出了什么问题,有人能帮帮我吗?

非常感谢!

杰瑞

93329 次浏览

您要查找的是 diff的返回值,而不是示例代码中使用的 diff的输出。

试试这个:

diff a b
if [ $? -ne 0 ]; then
echo "The directory was modified";
fi
if ! diff -q a b &>/dev/null; then
>&2 echo "different"
fi
ls -lR $dir > a
ls -lR $dir > b


DIFF=$(diff a b)
if [ "$DIFF" != "" ]
then
echo "The directory was modified"
fi
DIFF=$(diff -u <(find dir1/ -type f -printf '%P\n' | sort) <(find dir2/ -type f -printf '%P\n' | sort))
if [ "$DIFF" ]; then
echo "Directories differ"
# Do other stuff here
fi

这使用了我最喜欢的抨击方法之一,<()进程替换。

$DIFF变量保存可打印的差异。如果您想向最终用户显示它,一定要双引号,例如 echo "$DIFF"

如果你只想告诉用户有 任何的差异,如果可以缩短到类似 [ "$(diff ...)" ] && echo "Difference found"的东西

注意 : 我假设最初的问题意味着使用 dir1dir2来使问题更有意义。如果在时间0是 dir,然后在时间1是 dir,这种方法显然不会起作用。

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

cmp a b || echo 'The directory was modified'

该指示可解释为: “要么 a 和 b 相等,要么 i 重复消息”。

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

为了便于阅读,我想写成两行:

cmp a b \
|| echo 'The directory was modified'