配列をコピーしたい場合は、「配列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=(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つ(配列としてコピーされていない)
添字には変数を使うこともできます。未定義の変数を添字に使った場合は「0」として扱われます。
以下では、変数「birthday」に10をセットし、days[birthday]に「My Birthday」とセットしています。days[birthday]は、days[$birthday]としても同じ結果となります。
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
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
配列の添字に、数値ではなく文字列を指定したい場合は「連想配列」を使用します。連想配列については次回取り上げます。
西村 めぐみ(にしむら めぐみ)
もともとはDOSユーザーで「DOS版UNIX-like tools」を愛用。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社などの“PCヘルパー”やピンポイント研修なども行っている。
Copyright © ITmedia, Inc. All Rights Reserved.