Del*_*lta 2 scripting bash shell-script
所以,我正在编写一个备份脚本,并想跳过 .iso 文件。
如果我从命令行使用命令,一切正常:
rsync -a --delete --exclude='*.iso' /home/user/Desktop/Work /mnt/profile/Desktop/
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在我的脚本中使用它时,没有获得“排除”设置,并继续复制 .iso 文件。这是脚本:
#!/bin/bash
set -e
SRC_DIR="/home/user/Desktop/Work"
DST_MOUNTPOINT="/mnt/profile"
DST_DIR="/mnt/profile/Desktop/"
OPTIONS=" --exclude='*.iso' "
mountpoint -q $DST_MOUNTPOINT || mount $DST_MOUNTPOINT
rsync -a --delete $OPTIONS $SRC_DIR $DST_DIR
Run Code Online (Sandbox Code Playgroud)
如果我运行脚本,获取它的 PID 并检查 /proc/PID/cmdline,排除设置就在那里。
我做错了什么?
您在排除模式上加引号。
OPTIONS=" --exclude='*.iso' "
rsync $OPTIONS
Run Code Online (Sandbox Code Playgroud)
在这里,OPTIONS包含. 由于它没有在命令行中引用,因此会发生分词,删除末尾的空格。但是字符串中的单引号仍然存在,并传递给. 该模式不匹配,因为您不太可能在开头和结尾处使用带引号的文件名。<space>--exclude='*.iso'<space>rsyncrsync
删除多余的引号(和空格)并引用您的变量:
OPTIONS="--exclude=*.iso"
rsync "$OPTIONS" "$SRC_DIR" "$DST_DIR"
Run Code Online (Sandbox Code Playgroud)