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

Arb*_*zar 3 linux bash shell

我对declare -A这里的内容感到困惑,有人可以解释一下吗?

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

for role in $roles; do
    deploy[$role]=${!role}
done
Run Code Online (Sandbox Code Playgroud)

更迷惑 ${!role}

pax*_*blo 6

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
Run Code Online (Sandbox Code Playgroud)

就位而言${!role},这是间接扩展。通常,变量将具有一级扩展,如下所示:

pax> plugh=xyzzy
pax> xyzzy=zorkmid
pax> echo ${plugh}
xyzzy
Run Code Online (Sandbox Code Playgroud)

但是,您也可以将名称的扩展视为另一个随后扩展的变量

pax> echo ${!plugh}
zorkmid
Run Code Online (Sandbox Code Playgroud)

发生的事情plugh是 扩展为xyzzy,然后它本身再次扩展为zorkmid

例如,在您的特定情况下,变量role设置为test1,以下几行是等效的:

deploy[$role]=${!role}
deploy[test1]=${test1}
Run Code Online (Sandbox Code Playgroud)