Bash给出printf -v无效选项错误

时间:2012-08-15 09:32:44

标签: bash

我在机器上用这个命令做了一个脚本

printf -v $1 %s $2

它在我正在使用的服务器上正常工作。但是当我将脚本复制到另一台服务器时,我收到了这个错误。我在这里缺少什么?

编辑:代码对我的脚本的作用是声明变量,但不是在函数上本地化。这是完整的功能

#Declare each property=value as regular bash variable=value
function getProperty {
    for x in $(echo ${1} | tr ":" "\n")
    do
        set -- $(echo ${x} | tr "=" "\n")
        printf -v $1 %s $2
        #I tried using declare, but the variables become localized to this function only
    done
}

2 个答案:

答案 0 :(得分:2)

export会工作吗?

export "${1}=$(printf %s "$2")"

我可能会在这里咆哮错误的树......

答案 1 :(得分:1)

看起来你正试图以下列形式输入一些内容:

var=value:var=value

如果输入的任何部分包含空格,换行符或glob字符,则会失败。见:don't read lines with for。如果第一个参数为空,它也将失败。因为你的扩展是不加引号的,所以你要处理多次通配和分词,这可能会导致问题。

不幸的是,间接分配是Bash最大的失败之一。如果你这么做很多,你应该认真考虑将整个脚本切换到ksh,你可以使用nameref变量。这个功能非常值得。 (下一个版本的Bash应该解决这个问题。)

您应该使用数组来处理集合。如果你需要像这样处理键值对,那么你应该使用Bash 4和关联数组。 printf -v是在最近的Bash中间接分配到外部作用域的最佳方法。如果您有Bash 4.2,则可以使用declare -g分配给全局。如果您的bash太旧而无法执行此操作,请升级。

这里解释了一些技术以及如何使用关联数组:http://mywiki.wooledge.org/BashFAQ/006

另请阅读如何quote