配列
宣言の仕方は{変数名}=({要素1} {要素2} {要素3})
のように書きます。要素間の間は半角スペースを入れます。
1 |
list=(hoge fuga piyo) |
個別要素の表示
配列の各要素は${変数名[インデックス番号]}
で格納されているので以下のようにして出力できます。
{}
で挟まなければ$変数名
に
という文字列を付け加えた結果として扱ってしまうため、必ず囲むようにします。インデックス番号]
1 2 3 4 |
$ echo ${list[0]} # <= 必ず中括弧で囲む hoge $ echo $list[0] # <= ダメな例 hoge[0] # <= $listに'[0]'をつけただけになる |
配列要素のインデックスについて
配列のインデックス番号は0からスタートします。
要素のインデックスの途中を省いて宣言することもできます。
1 2 3 4 5 6 7 |
$ list=(hoge fuga [3]=piyo [5]=aaa bbb) $ echo ${list[2]} # <= インデックス2は空 $ echo ${list[3]} piyo # <= インデックス3 $ echo ${list[6]} bbb # <= インデックス5の次の要素なので自動で6番目の要素となっている |
配列一覧の表示
配列の全要素は${変数名[@]}
で出力することができます。
1 2 3 |
$ list=(hoge fuga piyo) $ echo ${list[@]} hoge fuga piyo |
また、各要素のインデックス番号の出力は${!変数名[@]}
で可能です。
1 2 |
$ echo ${!list[@]} 0 1 2 |
配列要素の追加
インデックス番号を指定して要素を追加する場合は変数名[インデックス番号]=要素
で追加できます。
1 2 3 |
$ list[4]=aaa $ echo ${list[@]} hoge fuga piyo aaa |
また、末尾に追加する場合は変数名+=(要素)
の形式で可能です。
スペース区切りで複数要素を追加できます。
1 2 3 4 |
$ list+=(bbb) $ list+=(ccc ddd) # <= 複数要素を追加できる $ echo ${list[@]} hoge fuga piyo aaa bbb ccc ddd |
配列要素の更新
すでに要素が登録されているインデックス番号を指定して上書きすることで要素の更新ができます。
1 2 3 4 |
$ list=(hoge fuga piyo) $ list[0]=aaa $ echo ${list[@]} aaa fuga piyo # <= インデックス0が更新された |
配列要素の削除
unset 変数名[インデックス番号]
で配列の要素の削除が可能です。
また、削除されたインデックスはそのままですので注意です。
1 2 3 4 5 6 |
$ list=(hoge fuga piyo) $ unset list[1] # <= インデックス1を削除 $ echo ${list[@]} hoge piyo $ echo ${list[1]} # <= 何も出力されない |
配列のコピー
配列のコピーは以下の形式でできます。
コピー先変数=("${コピー元変数[@]}")
少しややこしいのですが、
最初の()
は冒頭の配列の宣言の通り全体を小括弧で囲んでいて、内部の"${変数名[@]}"
は配列一覧表示の部分で、両方を組み合わせています。
ここで生成した新しい配列はインデックスに空きがあっても詰めてた状態になっているという点がポイントです。
1 2 3 4 5 6 7 |
$ list=(hoge fuga piyo) $ unset list[1] $ new_list=("${list[@]}") # <= 配列のコピー $ echo ${new_list[@]} hoge piyo $ echo ${new_list[1]} piyo # <= 空き要素が詰められているのでインデックス1で表示される |
まとめ
- 配列の宣言の仕方は
変数名=(要素1 要素2 要素3)
の形式(要素間はスペースで) - 追加はインデックスを指定するか
変数名+=(要素1)
のように末尾に追加できる - 更新はインデックス番号を指定して上書きするだけ
- 削除は
unset 変数名[インデックス番号]
、削除されたインデックスは空のママである - 配列のコピーは
コピー先=("${コピー元[@]}")
で可能、コピー元の開いたインデックスは詰められる