前回に引き続き、今回のテーマも「配列」です。配列の削除とコピー、添字に変数を使う方法について取り上げます。
配列の削除には「unset」コマンド(Linuxコマンド基本Tips:第307回)を使います。「unset 配列名」で全ての配列が削除され、「unset 配列[添字]」とした場合は添字で指定した要素が削除されます。
unset week (配列weekを削除) unset week[1] (配列weekの添字「1」の要素を削除)
配列の要素を削除した場合、配列の要素数は1つ減りますが、添字自体は変わりません。例えば、「week[0]」は「Sun」、「week[1]」は「Mon」、「week[2]」は「Tues」……となっている場合、「week[1]」を削除しても、「week[2]」の値は「Tues」のまま変わりません。
これを、for文で確認してみましょう。以下では、配列weekをSun〜Satで定義し直して、for文を実行しています。
$ week=(Sun Mon Tues Wed Thur Fri Sat) ← 配列weekを定義 $ unset week[1] ← 添字「1」の要素を削除 $ for ((i=0; i<${#week[@]}; i++)) do echo $i ${week[i]}; done ←(1) 0 Sun 1 2 Tues 3 Wed 4 Thur 5 Fri $ for day in ${week[@]}; do echo $day; done ←(2) Sun Tues Wed Thur Fri Sat $ for i in ${!week[@]}; do echo $i ${week[$i]}; done ←(3) 0 Sun 2 Tues 3 Wed 4 Thur 5 Fri 6 Sat
変数「i」を使って、0から順番に表示している最初のfor文(1)では、「week[1]」に該当する表示が空白になっている点、また、個数が1つ減っていることから「week[6]」を表示する前にfor文が終了している点に注意してください。
2つ目の「in」を使っているfor文(2)の場合は、そもそも添字を使っておらず、配列weekの内容が全て表示できています。
3つ目の「in」で添字を参照しているfor文(3)の場合は、定義されている添字だけで配列の全ての値を参照することができます。
要素を削除するのではなく、「値を空にする」というやり方もあります。この場合、要素の個数は減りません。
week[1]= (配列weekの添字「1」の要素を空にする)
$ week=(Sun Mon Tues Wed Thur Fri Sat) $ week[1]= ← 添字「1」の要素を空にする $ for ((i=0;i<${#week[@]};i++)) do echo $i ${week[i]}; done ←(1) 0 Sun 1 2 Tues 3 Wed 4 Thur 5 Fri 6 Sat $ for day in ${week[@]}; do echo $day; done ←(2) Sun Tues Wed Thur Fri Sat $ for i in ${!week[@]}; do echo $i ${week[$i]}; done ←(3) 0 Sun 1 2 Tues 3 Wed 4 Thur 5 Fri 6 Sat
「week[1]」は存在しているため、添字を使って繰り返しているfor文((1)と(3))は、0、1、2、3、4、5、6の7つとなります。一方、添字を使わずに繰り返しているfor文(2)では、6回分の繰り返しとなります。
削除した要素など、定義されていない変数を参照したらエラーにしたい、という場合は、bashの「nounset」オプションを有効にします。
「nounset」オプションは、「set -o nounset」または「set -u」で有効、「set +o nounset」または「set +u」で無効にできます(Linuxコマンド基本Tips:第208回)。
$ set -u ← 「nounset」オプションを有効にする $ week=(Sun Mon Tues Wed Thur Fri Sat) $ unset week[1] ← 添字「1」の要素を削除する $ for ((i=0;i<${#week[@]};i++)) do echo $i ${week[i]}; done 0 Sun -bash: week[i]: unbound variable $ set +u ← 元の設定に戻す(※)
【※】端末で設定した場合、setコマンドの設定は端末を閉じるまで有効。シェルスクリプトの場合は、シェルスクリプトが終了するまで有効なので、元に戻す必要は特にありません。ここでは動作のテストを行っているため設定を元に戻しています。
値を空にした場合は、「nounset」オプションが有効でも参照の際にエラーになりません。
$ set -u ← 「nounset」オプションを有効にする $ week=(Sun Mon Tues Wed Thur Fri Sat) $ week[1]= ← 添字「1」の要素を空にする $ for ((i=0;i<${#week[@]};i++)) do echo $i ${week[i]}; done 0 Sun 1 2 Tues 3 Wed 4 Thur 5 Fri 6 Sat $ set +u ← 元の設定に戻す
Copyright © ITmedia, Inc. All Rights Reserved.