我有以下用作配置的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")
我不知道造成错误的原因是什么,谷歌没有帮助。
答案 0 :(得分:2)
默认情况下,关联数组是 local 范围,通过添加-g
标志将其设为全局
declare -Ag servers
-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+
。