配列(連想配列)

初期化

 ARR[0]=1
 ARR[1]=2
 ARR[2]=3

または

 ARR=(1 2 3)

コマンドの結果を配列に格納する

 files=($(ls /tmp/))

1つの要素を参照

 echo ${ARR[0]}                         # => 1
 echo ${ARR[1]}                         # => 2
 echo ${ARR[2]}                         # => 3

全要素を参照

 echo ${ARR[@]}                         # => 1 2 3
 
 for a in ${ARR[@]}; do
   echo $a                              # => 1(2,3,...)
 done

配列の大きさ

 size=${#ARR[@]}                        # n = 3

ループの中で初期化

 for i in 1 2 3; do
     n=${#ARR[@]}
     ARR[$n]=$i
 done
 
 echo ${ARR[@]}                         # => 1 2 3

配列に要素を追加(push)

 ARR1=(1 2 3)
 ARR1=(${ARR1[@]} 0)
 
 echo ${ARR1[@]}                        # => 1 2 3 0

配列と配列をマージ

 ARR1=(1 2 3)
 ARR2=(7 8 9)
 ARR1=(${ARR1[@]} ${ARR2[@]})
 
 echo "${ARR1[@]}"                      # => 1 2 3 7 8 9

連想配列

初期化

 USER_NAME=taro
 USER_AGE=20
 USER_SEX=man

参照

 for key in NAME AGE SEX; do
     val=$(eval 'echo $USER_'$key)
     echo $val                          # => taro(20,man)
 done
  • 「連想配列名_キー名」のようなルールで変数を作る。
  • ここでは連想配列名がUSER、キー名がNAME/AGE/SEX。
  • 連想配列の値の取得は以下のようにして行っている。
    • $()によるコマンド置換が行われる際に、$keyが展開されてNAMEやAGEのような文字列になる。
    • 次にevalが実行される際に、'echo $USER'は展開されてecho $USERという文字列になり、事前に展開されていたNAMEやAGEと文字列連結され、echo $USER_NAMEやecho $USER_AGEがevalの引数になる。
    • これでvalには$USER_NAMEや$USER_AGEの値が入る。

bashの変数の間接参照を使う場合

 for key in NAME AGE SEX; do
    _key="USER_$key"
    echo ${!_key}
 done

変数の始めに!マークを付けると間接参照されて、USER_KEY(やUSER_AGE)が参照される。さらに間接参照は「*」でワイルドカードのようにマッチング出来る。これを使うと、

 for key in ${!USER_*}; do
    _key=${key#*_}
    val=${!key}
    echo "$_key => $val"
 done

のように、${!USER_*}で"USER_"から始まる変数名(すなわちUSER_NAME,USER_AGE,USER_SEX)を変数keyに取り出せて、この変数名を間接参照する(val=${!key}の部分)と、元の値(taro,20,man)を取り出せる。詳しくはman bashでparameter expansionを参考にする。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS

Last-modified: 2012-05-21 (月) 02:46:03