シェルスクリプトに挑戦しよう(16)配列[基本編]“応用力”をつけるためのLinux再入門(36)(1/2 ページ)

bashでは「配列」を扱うことができます。配列とは、1つの名前の変数で複数の値を管理できるようにしたものです。これまで、引数を参照するとき(本連載第25回)や、入力を受け取る際(本連載第30回)に使用していました。今回は、この配列にスポットを当てて、使い方や注意事項を確認します。

» 2019年05月22日 05時00分 公開
[西村めぐみ@IT]
「“応用力”をつけるためのLinux再入門」のインデックス

“応用力”をつけるためのLinux再入門

配列の基本操作

 「配列」は、「変数名[添字]=値」でセットし、「${変数名[添字]}」で参照します(※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文で配列の値を表示する(1)――連続した数値で参照する

 配列の添字は、連続していなくても構いません。しかし、連続した数字にしておくことで、「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
▲実行結果(先ほどの実行結果の端末を閉じてしまった場合は、seasons[0]〜seasons[3]に値をセットしてから実行する)

●for文で配列の値を表示する(2)――「in」を使って参照する

 「in」を使うと、添字を使わずに個々の値を表示することができます。この場合、添字が連続した数字になっている必要はありません。

for season in ${seasons[@]}
do
  echo $season
done
▲コマンド例
$ for season in ${seasons[@]}
> do
> echo $season
> done
Spring
Summer
Autumn
Winter
▲実行結果

●for文で配列の値を表示する(3)――「in」で添字を使って参照する

 「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
▲実行結果
       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。