从bash脚本运行时出现Rsync语法错误

Kro*_*907 1 syntax bash rsync

我一直在研究使用rsync进行增量备份的备份脚本.

我已手动测试了以下rsync命令,它运行并完成备份而没有错误:

rsync -aAXv --delete --progress --link-dest=/backup/Uyuk/Uyuk-backup-part1/2014-02-24/ /mnt/backup/ /backup/Uyuk/Uyuk-backup-part1/2014-02-25/
Run Code Online (Sandbox Code Playgroud)

但是,当我在备份脚本中运行相同的命令时,它会给我以下错误:

rsync: -aAXv --delete --progress --link-dest=/backup/Uyuk/Uyuk-backup-part1/2014-02-24/ /mnt/backup/ /backup/Uyuk/Uyuk-backup-part1/2014-02-25/: unknown option
rsync error: syntax or usage error (code 1) at main.c(1422) [client=3.0.6]
Run Code Online (Sandbox Code Playgroud)

我在我的脚本上运行了bash -x来确定发送到控制台的确切内容,以下是打印的内容:

+ rsync '-aAXv --delete --progress --link-dest=/backup/Uyuk/Uyuk-backup-part1/2014-02-24/ /mnt/backup/ /backup/Uyuk/Uyuk-backup-part1/2014-02-25/'
Run Code Online (Sandbox Code Playgroud)

有谁看到有什么问题?我找不到任何会导致语法错误的东西.

编辑:这是我在脚本中的实际代码,这是一个非常大的脚本,所以是的,这里没有定义一些变量,但你明白了.

mkdir -p "/backup/$HOST/$NAME/$TODAY"
#source directory
SRC="$MNT"
#link directory
LNK="/backup/$HOST/$NAME/$LAST/"
#target directory
TRG="/backup/$HOST/$NAME/$TODAY/"
#rsync options
OPT1="-aAXv --delete --progress --link-dest=$LNK"

#run the rsync command
echo "rsync $OPT1 $SRC $TRG"
rsync "$OPT1 $SRC $TRG" > /var/log/backup/backup.rsync.log 2>&1
Run Code Online (Sandbox Code Playgroud)

che*_*ner 5

你是通过你的选项列表作为一个参数,当需要作为传递它列表的参数.通常,您应该使用数组bash来保存您的参数,以防它们中的任何一个包含空格.请尝试以下方法:

mkdir -p "/backup/$HOST/$NAME/$TODAY"
#source directory
SRC="$MNT"
#link directory
LNK="/backup/$HOST/$NAME/$LAST/"
#target directory
TRG="/backup/$HOST/$NAME/$TODAY/"
#rsync options
OPTS=( "-aAXv" "--delete" "--progress" "--link-dest=$LNK" )

#run the rsync command
echo "rsync $OPT1 $SRC $TRG"
rsync "${OPTS[@]}" "$SRC" "$TRG" > /var/log/backup/backup.rsync.log 2>&1
Run Code Online (Sandbox Code Playgroud)

${OPTS[@]}引用时,数组扩展被特别视为一系列参数,每个参数都被单独引用以保留各个元素中的任何空格或特殊字符.如果arr=("a b" c d),则echo "${arr[@]}"与之相同

echo "a b" "c" "d"
Run Code Online (Sandbox Code Playgroud)

而不是

echo "a b c d"
Run Code Online (Sandbox Code Playgroud)

这在不支持数组的shell中不起作用,但是,发明了数组,因为没有安全的方法(即没有使用eval)来处理这个没有它们的用例.