如何在没有-g选项的函数中声明全局数组?

时间:2016-02-16 16:29:08

标签: arrays bash shell unix scripting

我正在编写一个shell脚本来读取配置文件中的键值,并根据其名称动态创建数组。请考虑shell函数中的以下语句:

declare "${fruit[i]}}"[x]=${var}

这非常有效并且正确地分配了数组元素,但是当在函数内部使用时,这个数组不是全局的。我知道bash的更高版本支持-g选项,它将变量/数组声明为全局但我使用的是旧版本的bash(使用我所拥有的)不支持此选项。

如何在此处模拟declare -g选项以使我的数组全局化?我试过用eval和readonly玩,但我没有运气。

修改 我还想提一下,我分配给动态数组的元素也包含空格。这是我在尝试时打破我的eval命令的原因。

1 个答案:

答案 0 :(得分:2)

根据gniourf_gniourf的建议,您可以使用printf -v(在bash 4.1或更高版本中)

printf -v "${fruit[i]}[x]" "%s" "$var"

read

read "${fruit[i]}[x]" <<< "$var"

您可能只需要确保传递给eval的表达式包含适当的引号。

$ fruit=(apple pear orange)
$ f () { eval "${fruit[$1]}[$2]=\"$3\""; }
$ f 0 2 'hi there'  # apple[2]='hi there'
$ declare -p apple
declare -a apple='([2]="hi there")'

考虑到执行任意代码的风险,不应该不建议这样做。