2016-08-18 5 views
1

から、配列のインデックスを取得し、配列を参照し、変数の名前からその値を取得することができますことを発見:同じアプローチを使用している場合、私は興味があった名前(ちょうど楽しみのために)バッシュの中を出し抜く

[email protected]:~$ ARR=(one two); 
[email protected]:~$ ARRAYINDIRECT="ARR[@]" 
[email protected]:~$ echo "${!ARRAYINDIRECT}" 
one two 

配列のインデックスも取得できます。通常、私はそうすることでそれをします:

[email protected]:~$ ARR=(one two); echo "${!ARR[@]}" 
0 1 

しかし、正しい構文を見つけることができません。ここに私が試したいくつかの方法があります:

[email protected]:~$ ARR=(one two); ARRAYINDIRECT="ARR[@]"; echo "${!!ARRAYINDIRECT}" 
bash: !ARRAYINDIRECT}: event not found 

ARR=(one two); ARRAYINDIRECT="!ARR[@]"; echo "${!ARRAYINDIRECT}" 
bash: !ARR[@]: event not found 

# Increasingly desperate attempts... 
[email protected]:~$ ARR=(one two); ARRAYINDIRECT="\!ARR[@]"; echo "${!ARRAYINDIRECT}" 

[email protected]:~$ ARR=(one two); ARRAYINDIRECT="ARR[@]"; echo "${!${!ARRAYINDIRECT}}" 
bash: ${!${!ARRAYINDIRECT}}: bad substitution 
[email protected]:~$ ARR=(one two); ARRAYINDIRECT="ARR[@]"; echo "${\!!ARRAYINDIRECT}" 
bash: !ARRAYINDIRECT}: event not found 
[email protected]:~$ ARR=(one two); ARRAYINDIRECT="ARR[@]"; echo "${!\!ARRAYINDIRECT}" 
bash: ${!\!ARRAYINDIRECT}: bad substitution 

質問:それは名前で参照した後、配列のインデックスの配列を取得することは可能でしょうか?あなたはBASH 4.2 +を使用している場合

+0

@wjandreaすることができますはい、anubhavaの答えを!最初の文の最初の行の最初の単語から述べたように、* Bashで楽しんでいる*ので、そうすることで何も教えてくれません。あなたが有効なユースケースを望むなら、配列を関数に名前で渡すことは、それらを操作するためのものです( 'local'変数でも動作します!)ので、配列の要素を反復してマッピングするなら、新しい配列にインデックス構造を残したかったのです。実際、名前で渡すと、インデックスベースの操作には最適です。 –

答えて

2

あなたはdeclare -nを使用することができます。

arr=(one two) 

declare -n arrayindirect=arr 

echo "${arrayindirect[@]}" 
one two 

echo "${!arrayindirect[@]}" 
0 1 

declare -p arrayindirect 
declare -n arrayindirect="arr" 
+1

驚くばかりです - 予想よりも実装するのがずっと簡単です! –

関連する問題