連載
» 2019年05月29日 05時00分 公開

“応用力”をつけるためのLinux再入門(37):シェルスクリプトに挑戦しよう(17)配列[応用編] (2/2)

[西村めぐみ,@IT]
前のページへ 1|2       

配列のコピー

 配列をコピーしたい場合は、「配列2=(${配列1[@]})」のようにします。

week=(Sun Mon Tues Wed Thur Fri Sat)
myweek=(${week[@]})
▲コマンド例
$ week=(Sun Mon Tues Wed Thur Fri Sat)		← 配列weekに値をセット
$ echo ${week[@]}						←配列weekの値を表示
Sun Mon Tues Wed Thur Fri Sat
$ myweek=(${week[@]})					← myweekに配列weekの値をコピー
$ echo ${myweek[@]}					← myweekの値を表示
Sun Mon Tues Wed Thur Fri Sat				← 配列weekと同じ値が表示されている
$ for ((i=0;i<${#myweek[@]};i++)) do echo $i ${myweek[i]}; done 	← 配列myweekの全ての添字と値を表示
0 Sun
1 Mon
2 Tues
3 Wed
4 Thur
5 Fri
6 Sat
▲実行結果

 「myweek=${week[@]}」のように、「(」〜「)」を付けていない場合、配列としてコピーされない点に注意してください。

 以下の実行例は「()」を忘れたという失敗例です。テストのため、先ほど使用したweekとmyweekはいったんunsetコマンドで削除しました。

$ unset week
$ unset myweek
▲配列コピーの失敗例(テストのため、先ほど使用したweekとmyweekを削除する)
$ week=(Sun Mon Tues Wed Thur Fri Sat)		← 配列weekに値をセット
$ echo ${week[@]}						← 配列weekの値を表示
Sun Mon Tues Wed Thur Fri Sat
$ myweek=${week[@]}					← myweekに配列weekの値をコピー?
$ echo ${myweek[@]}					← myweekの値を表示
Sun Mon Tues Wed Thur Fri Sat				← 一見weekと同じ内容に見えるが……?
$ echo ${#week[@]}
7									← weekの要素は7つ
$ echo ${#myweek[@]}
1									← myweekの要素は1つ(配列としてコピーされていない)
▼○▲配列コピーの失敗例(あらためて配列weekを定義しmyweekへのコピーを試みる)
●添字に変数を使用する
 添字には変数を使うこともできます。未定義の変数を添字に使った場合は「0」として扱われます。
 以下では、変数「birthday」に10をセットし、days[birthday]に「My Birthday」とセットしています。days[birthday]は、days[$birthday]としても同じ結果となります。
▼○pwl
birthday=10				← 変数「birthday」に10をセットする
days[birthday]="My Birthday"
echo ${days[birthday]}
echo ${days[$birthday]}		← 上と同じ結果になる
▲コマンド例
$ birthday=10
$ days[birthday]="My Birthday"
$ echo ${days[birthday]}
My Birthday
$ for ((i=1;i<=31;i++))
> do
> echo $i ${days[i]}
> done
1
2
3
4
5
6
7
8
9
10 My Birthday
11
12
13
…
31
▲実行結果

●変数名を間違えた場合

 変数名の大文字/小文字は区別される点に注意してください。以下の実行結果では変数「birthday」を定義したのに、添字で「Birthday」を使ってしまった、という失敗例です。

$ unset days					← テストのため、先ほど定義した配列daysを削除する
$ birthday=10					← 変数birthdayに10をセット
$ days[Birthday]="My Birthday"		← 添字に「Birthday」を指定した
$ echo ${days[birthday]}
							← days[birthday]は定義されていないため何も表示されない
$ echo ${days[0]}
My Birthday					← days[0]に値が入っていた!
▲実行結果

●添字の変数に数値以外をセットした場合

 先ほどの例では変数birthdayに「10」をセットしたので、「days[birthday]」は「days[10]」という意味になりました。

 それでは、次のように文字列をセットした場合はどうなるでしょうか。

birthday="ten"
days[birthday]="My Birthday"
echo ${days[birthday]}
▲コマンド例

 この場合、「days[birthday]」は「days[ten]」という意味になり、変数tenは未定義なのでやはりdays[0]に値がセットされることになります。以下の2つのサンプルを比較して見ると様子が分かります。

unset days
birthday=ten
days[$birthday]="My Birthday"
echo ${days[birthday]}
for ((i=0;i<=31;i++)) do
  echo $i ${days[i]}
done
▲サンプル1
unset days
ten=10
birthday=ten
days[$birthday]="My Birthday"
echo ${days[birthday]}
for ((i=0;i<=31;i++)) do
  echo $i ${days[i]}
done
▲サンプル2

 配列の添字に、数値ではなく文字列を指定したい場合は「連想配列」を使用します。連想配列については次回取り上げます。

筆者紹介

西村 めぐみ(にしむら めぐみ)

もともとはDOSユーザーで「DOS版UNIX-like tools」を愛用。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社などの“PCヘルパー”やピンポイント研修なども行っている。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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