将动态生成的参数传递给脚本内部的命令
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.log
,something
语句实际上写入了 /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数组构成动态命令行
我有一个脚本可以使用一些动态生成的参数调用 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.log
,something
语句实际上写入了 /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数组构成动态命令行