シェルスクリプトのfor文で配列変数を使いたい。


配列変数をfor文に渡して、配列要素にアクセスしたいのですが、うまくいきません。  
このようなアクセスはできないのでしょうか？

[code]

    list1=(aa bb)
    list2=(cc dd)
    
    for l in list1 list2
    do
      echo $l[0];
      echo $l[1];
    done
    
[/code]

**実行結果**

[code]

    list1[0]
    list1[1]
    list2[0]
    list2[1]
    
[/code]

**期待する結果**

[code]

    aa
    bb
    cc
    dd
    
[/code]




「このようなアクセス」というのが `indirect reference`(間接参照)を意味するのであれば、bash でもできなくはないです。

[code]

    list1=(aa bb)
    list2=('cc      123' -n)
    
    for l in list1 list2
    do
      eval printf '%s\\n' \"\${$l[1]}\"
      eval printf '%s\\n' \"\${$l[0]}\"
    done
    
[/code]

`eval` を使うので `\\n` や `\"` としています。また、`echo` ではなく `printf` を使っているのは配列の要素に `-n` や
`-e` がある場合を考慮しているためです(`echo` のオプションとして処理されてしまいます)。




bashのfor文は`in`の後に記述されたものを順番に実行します。そのため、`l`に入れる要素が`in`のあとに順番に並んでいる必要があります。

[code]

    for l in "${list1[@]}" "${list2[@]}"
    do
      echo $l
    done
    
[/code]

