如何在 Unix Bash Shell 的条件语句中使用 "directories are the same"?

How to use "directories are the same" in a conditional in Unix Bash Shell?

我想有条件地比较两个目录。

if [ rsync -ai --dry-run dir1/ dir2/ ]; then
  echo "Different!"
fi

但是,我遇到了一个错误。\

./test.sh: line 44: [: too many arguments

如何修复此错误并让条件回显当且仅当目录不同时?

请注意,rsync 在没有条件的情况下按预期工作。

rsync -ai --dry-run dir1/ dir2/

returns 当 dir1 和 dir2 相同时为空。否则为非空值。

[[ -n string ]] returns 如果字符串的长度不为零则为真,所以你可以这样做:

if [[ -n $(rsync -ai --dry-run dir1/ dir2/) ]]; then
  echo "Different!"
fi

[ ] 中的内容是测试表达式,而不是命令。类似于 [ 5 -gt 4 ][ "foo" = "bar" ]。该 rsync 命令作为表达式没有任何意义,因此您会收到一个(不是很清楚的)错误。

可以使用 "$( )" 捕获命令的输出,然后使用 -n 测试运算符 if [ -n "$(rsync ...)" ] 测试它是否为空白,但实际上这里有更好的方法. if 之后的内容本身就是一个命令。 [ 是一个非常常用的命令,但您可以在那里使用任何命令(或管道,或其他)。本质上,它是 "if this command succeeds, then..." 所以你可以这样做:

if rsync -ai --dry-run dir1/ dir2/ | grep -q "."; then

这会将 rsync 命令的输出提供给 grep,搜索“.” (匹配任何字符的模式,即是否有 any 输出),并且 -q (安静)选项告诉它不要打扰打印匹配,如果有则以成功状态退出至少一场比赛。