【问题标题】:Pass dynamically generated parameters to command inside script将动态生成的参数传递给脚本内的命令
【发布时间】:2015-07-17 21:35:20
【问题描述】:

我有一个脚本,它使用一些动态生成的参数调用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: 无法打开日志文件 "/tmp/150507: 没有这样的文件或目录 (2)
忽略“日志文件”设置。

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

【问题讨论】:

    标签: bash parameters parameter-passing


    【解决方案1】:

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

    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 错误吗?
    猜你喜欢
    • 2018-07-23
    • 2014-03-08
    • 2013-10-22
    • 2016-12-19
    • 1970-01-01
    • 2013-10-11
    • 2017-11-23
    • 1970-01-01
    • 2020-05-09
    相关资源
    最近更新 更多