声明-A在Linux shell中做什么?

时间:2016-12-20 02:53:26

标签: linux bash shell

我对declare -A在这里所做的事情感到困惑,有人可以解释一下吗?

declare -A deploy
roles="test1 test2 test3 test4"

for role in $roles; do
    deploy[$role]=${!role}
done

更加混淆${!role}

2 个答案:

答案 0 :(得分:4)

declare -A deploydeploy标记为关联数组的名称,将一个字符串映射到另一个字符串。

每次循环时,都会添加与$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