1

我在一台机器上做了一个脚本,上面有这个命令

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
}
4

2 回答 2

2

export工作吗?

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

我可能在这里吠错了树...

于 2012-08-15T09:45:38.090 回答
1

看起来您正在尝试以以下形式获取一些输入:

var=value:var=value

如果输入的任何部分包含空格、换行符或全局字符,这将失败。请参阅:不要阅读带有 for 的行。如果第一个参数为空,它也会失败。因为您的扩展是未引用的,所以您正在处理多次通配符和分词,这可能会导致问题。

不幸的是,间接赋值是 Bash 最大的失败之一。如果您经常这样做,您应该认真考虑将整个脚本切换到可以使用 nameref 变量的 ksh。仅仅为了那个功能就非常值得。(下一个版本的 Bash 应该可以解决这个问题)。

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

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

另请阅读如何报价

于 2012-08-15T11:04:26.710 回答