通过Shell脚本中的变量正确指定数组和元素

时间:2012-05-15 07:40:17

标签: bash shell variables zsh

考虑以下无意义数组:

# KIND[ID]=NAME
MONKEYS[1]="Oo Oo"
MONKEYS[2]="Aa Aa"
MONKEYS[3]="Ba Nana"
LIONS[5]="Mister Mufasa"
LIONS[7]="Cocoa Puff"
LIONS[8]="Lala Leo"
TIGERS[13]="Ben Gal"
TIGERS[15]="Tee Eye Double Guh Err"
TIGERS[22]="Oh Esex Diez Punto Cuatro"

对于给定的KINDID,我正在尝试构建一个类似于$NAME[$ID]的字符串,以获取相关名称。

当显式声明数组名称时,该命令的行为与预期echo "${LIONS[5]}"=>"Mister Mufasa")相同。但是,无论何时使用变量,shell都会以字符串中的给定字符进行响应。

$LIONS[5] => 'e' # The fifth letter in "Mister Mufasa"

在其他情况下,我无法找到控制插值的方法来获取NAME

KIND="LIONS"
ID="5"

# Attempt to return value of `LIONS` when `KIND=LIONS`
echo $"${KIND}"; echo "\$${KIND}" #=> "$LIONS"
echo "$${KIND}" #=> "57800{KIND}" Interpolates "$$"
echo "\$\${KIND}"; "\$\${KIND}" #=> "$${KIND}"

我发现以下作品虽然“难看”......

eval echo `echo \\$${KIND}`

然而,当再次介绍ID事情时:

eval echo `echo \\$${KIND}[$ID]`
#> title:5: no matches found: $LIONS[5]
#> no matches found: $LIONS[5]

我觉得我很遗憾非常简单。我有一种预感,我忘了逃避什么,但我不太确定是什么。

此外,eval echo `echo...eval echo `print...的“冗余”替代方案是什么?

1 个答案:

答案 0 :(得分:1)

在bash中,使用间接寻址:

REF="$KIND[$ID]" # Sets REF to "LIONS[5]"
echo "${!REF}"   # Prints "Mister Mufasa"

编辑:在zsh中,改为使用嵌套扩展:

echo "${(P)${KIND}[ID]}"