* 配列(連想配列) [#gac5d133]
** 初期化 [#s909ac85]
ARR[0]=1
ARR[1]=2
ARR[2]=3
または
ARR=(1 2 3)
*** コマンドの結果を配列に格納する [#x7934ab3]
files=($(ls /tmp/))
** 1つの要素を参照 [#l7dd2f4f]
echo ${ARR[0]} # => 1
echo ${ARR[1]} # => 2
echo ${ARR[2]} # => 3
** 全要素を参照 [#cd2ee597]
echo ${ARR[@]} # => 1 2 3
for a in ${ARR[@]}; do
echo $a # => 1(2,3,...)
done
** 配列の大きさ [#x852e8cb]
size=${#ARR[@]} # n = 3
** ループの中で初期化 [#xc998351]
for i in 1 2 3; do
n=${#ARR[@]}
ARR[$n]=$i
done
echo ${ARR[@]} # => 1 2 3
** 配列に要素を追加(push) [#q052ccfd]
ARR1=(1 2 3)
ARR1=(${ARR1[@]} 0)
echo ${ARR1[@]} # => 1 2 3 0
** 配列と配列をマージ [#u12cd4dc]
ARR1=(1 2 3)
ARR2=(7 8 9)
ARR1=(${ARR1[@]} ${ARR2[@]})
echo "${ARR1[@]}" # => 1 2 3 7 8 9
** 連想配列 [#yc746620]
*** 初期化 [#u731c3f4]
USER_NAME=taro
USER_AGE=20
USER_SEX=man
*** 参照 [#e262441a]
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の変数の間接参照を使う場合 [#a7b820fd]
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}の部分)。これで元の値を取り出せる。詳しくはman bashでparameter expansionを参考にする。
のように、${!USER_*}で"USER_"から始まる変数名(すなわちUSER_NAME,USER_AGE,USER_SEX)を変数keyに取り出せて、この変数名を間接参照する(val=${!key}の部分)と、元の値(taro,20,man)を取り出せる。詳しくはman bashでparameter expansionを参考にする。