0

次の無意味な配列を考えてみましょう:

# 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"

指定されたKINDandを使用して、関連する名前を取得するためにID似た文字列を作成しようとしています。$NAME[$ID]

アレイ名を明示的に指定すると、コマンドは期待どおりに動作しecho "${LIONS[5]}"=>"Mister Mufasa"ます )。ただし、変数が使用されると、シェルは文字列内の指定された文字で応答します。

$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...存在しますか?

4

1 に答える 1

2

bash では、間接アドレス指定を使用します。

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

編集: zsh では、代わりにネストされた展開を使用します。

echo "${(P)${KIND}[ID]}"
于 2012-05-15T15:39:52.540 に答える