bashでは「配列」を扱うことができます。配列とは、1つの名前の変数で複数の値を管理できるようにしたものです。これまで、引数を参照するとき(本連載第25回)や、入力を受け取る際(本連載第30回)に使用していました。今回は、この配列にスポットを当てて、使い方や注意事項を確認します。
「配列」は、「変数名[添字]=値」でセットし、「${変数名[添字]}」で参照します(※1)。
【※1】「変数名[添字]」と定義することで、自動的に配列として扱われます。変数が配列であることを明示して定義したい場合は、「declare -a 配列名」のようにします。オプションに大文字の「A」を指定して「declare -A 配列名」のようにすると、連想配列になります(本連載第37回で扱います)。
まずは、コマンドラインで試してみましょう。入力を簡略化するために、実行例では引用符("")の入力を省略しています。なお、変数名と「[」の間、および「=」記号の前後には空白を入れることができない点に注意してください(※2)。
【※2】添字部分は算術式として扱われています。この後のfor文のように、添字部分を変数にして「${配列名[変数]}」のように参照したり、「配列名[変数]=値」で値をセットしたりする際(本連載第37回で扱います)、添字箇所の変数に$記号は不要です。
seasons[0]="Spring"
seasons[1]="Summer"
seasons[2]="Autumn"
seasons[3]="Winter"
echo ${seasons[3]}
echo "${seasons[0]} has come"
$ seasons[0]="Spring"
$ seasons[1]="Summer"
$ seasons[2]="Autumn"
$ seasons[3]="Winter"
$ echo ${seasons[3]}
Winter ← 「seasons[3]」の値が表示された
$ echo "${seasons[0]} has come"
Spring has come
配列の添字は、連続していなくても構いません。しかし、連続した数字にしておくことで、「for」文などで扱いやすくなります。
先ほどの配列「seasons」を、for文で表示してみましょう。
for ((i=0; i<4; i++)) do
echo $i ${seasons[i]} ← iの値とseasons[i]の値を表示する
done
ここでは、シェルスクリプトではなく、コマンドラインでfor文を入力しています(参考:連載『Linux基本コマンドTips』第215回)。2行目はfor文の続きなので、プロンプトが「>」と表示されています。
$ for ((i=0; i<4; i++))
> do
> echo $i ${seasons[i]}
> done
0 Spring
1 Summer
2 Autumn
3 Winter
「in」を使うと、添字を使わずに個々の値を表示することができます。この場合、添字が連続した数字になっている必要はありません。
for season in ${seasons[@]}
do
echo $season
done
$ for season in ${seasons[@]}
> do
> echo $season
> done
Spring
Summer
Autumn
Winter
「in」で添字を参照したい場合は、「変数 in ${!配列名[@]}」のように指定します。この場合、配列の個々の値を参照する際には「${配列名[$変数]}」のようにします。添字の「$」は省略できません。
for i in ${!seasons[@]}
do
echo $i ${seasons[$i]} ← 添字と値を表示する
done
$ for i in ${!seasons[@]}
> do
> echo $i ${seasons[$i]}
> done
0 Spring
1 Summer
2 Autumn
3 Winter
次に「値」を変更してみます。やり方は最初に定義したときと同じで、「配列名[添字]=値」のように書きます。
seasons[2]="Fall"
先ほどと同様に、コマンドラインで試してみます。for文は先ほどと同じなので、矢印キーまたは[Ctrl]+[P]/[Ctrl]+[N]キーで「ヒストリ」を利用するとよいでしょう。
$ seasons[2]=Fall
$ for ((i=0;i<4;i++))do echo $i ${seasons[i]}; done ← ヒストリを利用
0 Spring
1 Summer
2 Fall
3 Winter
配列として管理されている個々の変数を、配列の「要素」と呼びます。例えば、先ほど定義した配列「seasons」の要素は4つです。
配列に要素が幾つあるかは、「${#変数名[@]}」で調べることができます。
echo ${#seasons[@]}
$ echo ${#seasons[@]}
4
「配列名=(値 値 値…)」で、値をまとめてセットすることができます。この場合、添字は「0」からとなります(※3)。
【※3】「配列名=([添字]=値 [添字]=値 [添字]=値…)」のように、添字付きで設定することもできます。この場合、添字が連続していなくても構いません。
また、「${配列名[@]}」で、値をまとめて表示することがきます。
week=(Sun Mon Tues Wed Thur Fri Sat) ← 配列weekに値をセットする
echo ${week[0]} ← 最初の値(Sun)が表示される
echo ${week[6]} ← 7つ目の値(Sat)が表示される
echo ${week[@]} ← 配列の値をまとめて表示する
$ week=(Sun Mon Tues Wed Thur Fri Sat)
$ echo ${week[0]}
Sun
$ echo ${week[6]}
Sat
$ echo ${week[@]}
Sun Mon Tues Wed Thur Fri Sat
先ほどのseasons同様、配列「week」の値を添字0から順番に表示すると、以下のようになります。
$ for ((i=0;i<${#week[@]};i++))
> do
> echo $i ${week[i]}
> done
0 Sun
1 Mon
2 Tues
3 Wed
4 Thur
5 Fri
6 Sat
Copyright © ITmedia, Inc. All Rights Reserved.