首页 > 解决方案 > 如何在 Unix Bash Shell 的条件下使用“目录相同”?

问题描述

我想在条件下比较两个目录。

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

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

./test.sh:第 44 行:[:参数太多

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

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

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

当 dir1 和 dir2 相同时返回 null。否则为非空值。

标签: bashshellunixconditionalrsync

解决方案


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

可以使用 , 捕获命令的输出,并使用test operator:"$( )"进行测试以查看其是否为空白,但实际上这里有更好的方法。之后的事情本身就是一个命令。是在那里使用的一个非常常见的命令,但您可以在那里使用任何命令(或管道,或其他)。本质上,它是“如果这个命令成功,那么......”所以你可以这样做:-nif [ -n "$(rsync ...)" ]if[

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

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


推荐阅读