我对declare -A
在这里所做的事情感到困惑,有人可以解释一下吗?
declare -A deploy
roles="test1 test2 test3 test4"
for role in $roles; do
deploy[$role]=${!role}
done
更加混淆${!role}
答案 0 :(得分:4)
declare -A deploy
将deploy
标记为关联数组的名称,将一个字符串映射到另一个字符串。
每次循环时,都会添加与$roles
扩展名不同的单词作为数组的新键。 ${!role}
是间接参数扩展,扩展为名称为$role
的变量的值。循环等同于
deploy[test1]=$test1
deploy[test2]=$test2
deploy[test3]=$test3
deploy[test4]=$test4
答案 1 :(得分:3)
OAuth
定义了一个关联数组,可以将字符串映射到另一个字符串。
例如:
declare -A
就pax> declare -A mymap
pax> mymap[washington]=george
pax> mymap[lincoln]=abe
pax> echo ${!mymap[*]}
washington lincoln
pax> echo ${mymap[no_such_key]}
pax> echo ${mymap[washington]}
george
pax> echo ${mymap[lincoln]}
abe
位而言,这是间接扩展。通常,变量将具有一个扩展级别,如下所示:
${!role}
但是,您也可以将名称扩展视为另一个变量,随后进行扩展:
pax> plugh=xyzzy
pax> xyzzy=zorkmid
pax> echo ${plugh}
xyzzy
当pax> echo ${!plugh}
zorkmid
扩展为plugh
时会发生什么情况,然后又将其展开为xyzzy
。
在特定的情况下,例如,变量zorkmid
设置为role
,以下行是等效的:
test1