bash - 如何在 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。否则为非空值。
解决方案
输入的[ ]
是测试表达式,而不是命令。像[ 5 -gt 4 ]
或之类的东西[ "foo" = "bar" ]
。该 rsync 命令作为表达式没有任何意义,因此您会收到一个(不是很清楚)错误。
可以使用 , 捕获命令的输出,并使用test operator:"$( )"
进行测试以查看其是否为空白,但实际上这里有更好的方法。之后的事情本身就是一个命令。是在那里使用的一个非常常见的命令,但您可以在那里使用任何命令(或管道,或其他)。本质上,它是“如果这个命令成功,那么......”所以你可以这样做:-n
if [ -n "$(rsync ...)" ]
if
[
if rsync -ai --dry-run dir1/ dir2/ | grep -q "."; then
这会将rsync
命令的输出提供给grep
,搜索“。” (匹配任何字符的模式,即是否有任何输出),并且-q
(quiet) 选项告诉它不要打扰打印匹配项,如果至少有一个匹配项,则以成功状态退出。
推荐阅读
- laravel - 在 laravel 项目中,我试图从 mysql 数据库表“类别”中获取数据,除了一个“标题”之外的所有字段都返回
- javascript - 与 Vuex、axios 和多个组件实例进行封装数据共享
- ruby-on-rails - 未初始化的常量 GraphqlController::GraphQLSchema
- android-source - 如何解决 AOSP 构建中的 API Lint 错误?
- node.js - 用 brew 安装纱线
- metal - 我想用金属将RGB转换为YUV
- directx-11 - HSLT 自定义 Direct2D 效果中分辨率高时的纹理分割
- javascript - 将对象数组传递给组件 VueJ
- docker - 从 docker 容器运行 Gazebo(或turtlebot 3)时出现问题
- javascript - 如何通过自动检测学科代码的学分和分数的成绩来计算 GPA