配置从bash中的函数加载的数组的文件

时间:2017-03-22 12:20:01

标签: bash config

我有以下用作配置的bash文件:

# config
servers=(
    [vagrant.host]=192.168.20.20
    [vagrant.port]=22
    [vagrant.user]=ubuntu
    [vagrant.identity]=~/.ssh/id_rsa
    [vagrant.cwd]=/home/ubuntu/website
)

我用我的主脚本加载它:

declare -A servers
. config

echo "${servers["vagrant.host"]}" # prints 192.168.20.20

如果代码不在函数中,它可以很好地工作,但我不需要总是加载配置文件,我将加载代码放在一个函数中。当我调用如下所示的函数时,我收到一个错误。

function loadConfig {
    declare -A servers
    . config
}

loadConfig

echo "${servers["vagrant.host"]}" 
# vagrant.host: syntax error: invalid arithmetic operator (error token is ".host")

我不知道造成错误的原因是什么,谷歌没有帮助。

2 个答案:

答案 0 :(得分:2)

默认情况下,关联数组是 local 范围,通过添加-g标志将其设为全局

declare -Ag servers

The declare builtin command

  

-g   在shell函数中使用时创建全局变量;否则忽略(默认情况下,声明在shell函数中使用时声明 local 范围变量)

在调试器模式下使用明显的脚本运行相同的脚本,产生了我,

$ bash -x mainscript.sh
+ loadConfig
+ declare -Ag servers
+ . config
++ servers=([vagrant.host]=192.168.20.20 [vagrant.port]=22 [vagrant.user]=ubuntu [vagrant.identity]=~/.ssh/id_rsa [vagrant.cwd]=/home/ubuntu/website)
+ echo 192.168.20.20
192.168.20.20

答案 1 :(得分:1)

使用declare -g既简单又容易。

但它也会导致全球变量污染。如果您希望使用config并且不想要全局变量,则可以在函数调用中定义变量,例如:

function loadConfig {
    declare -n main="$1"    # needs bash 4.3 - create an reference to indirect name
    declare -A servers      # the array name used in the config (local only)
    . ./conf
    # copy the array to indrectly aliased array...
    for key in "${!servers[@]}"
    do
        main["$key"]="${servers["$key"]}"
    done
}

#MAIN
declare -A currservers  #declare your current array
loadConfig currservers  #pass its name to loadConfig

echo "${currservers['vagrant.host']}"
# 192.168.20.20

不幸的是,这需要合理的新bash版本4.3+