将动态生成的参数传递给脚本内部的命令

Pass dynamically generated parameters to command inside script

我有一个脚本可以使用一些动态生成的参数调用 rsync 命令,但我无法正确传递它们。

摘录如下:

logfile="$logDir/$(timestamp) $name.log"
echo "something" >> "$logfile"

params="-aAXz --stats -h --delete --exclude-from $exclude --log-file=$logfile $src $dest"
if [ "$silent" = "" ]; then
    params="-v $params --info=progress2"
fi
rsync $params

如果日志文件是/tmp/150507 test.logsomething 语句实际上写入了 /tmp/150507 test.log,但是 rsync 将其日志写入 /tmp/150507(删除第一个空格后的所有内容)。

如果我在参数中明确引用日志文件的名称,rsync 会抛出异常:

params="-aAXz --stats -h --delete --exclude-from $exclude --log-file=\"$logfile\" $src $dest"

错误:

rsync: failed to open log-file "/tmp/150507: No such file or directory (2)
Ignoring "log file" setting.

如何在不失去在文件名中使用空格的能力的情况下动态生成参数?

日志文件名需要更多引用:

declare -a params

params=(-aAXz --stats -h --delete --exclude-from "$exclude" --log-file="$logfile" "$src" "$dest")

if [[ "$silent" = "" ]]; then
    params=( -v "${params[@]}" --info=progress2 )
fi

rsync "${params[@]}"

这种情况应该考虑使用BASH数组构成动态命令行