連想配列
JSONみたいなデータ構造を連想配列と言い、シェルスクリプトでもそれを表現することが可能です。
JSONの例:
1 2 3 4 5 |
{ "id": 1, "name": "Taro", "message": "Hello!" } |
シェルスクリプトでの連想配列:
1 |
$ declare -A a_list=([id]=5 [name]='Taro' [message]='Hello!') |
宣言の仕方
連想配列の宣言の仕方は特殊でdeclare -A 変数名=([キー1]=値1 [キー2]=値2 [キー3]=値3)
のように
先頭にdeclare -A
をつけてその後に変数名と各キーごとの値を入れる形になります。
要素の表示
個別の要素を取り出したいときは${変数名[キー名]}
のように配列のインデックスの代わりにキー名を指定すれば良いです。
1 2 3 |
$ declare -A a_list=([id]=5 [name]='Taro' [message]='Hello!') $ echo ${a_list[name]} Taro |
また、全ての値を出力したい場合は配列と同じく${変数名[@]}
とすればよく
1 2 3 |
$ declare -A a_list=([id]=5 [name]='Taro' [message]='Hello!') $ echo ${a_list[@]} 5 Taro Hello! |
全てのキーの場合も同じく${!変数名[@]}
とすれば出力できます。
1 2 3 |
$ declare -A a_list=([id]=5 [name]='Taro' [message]='Hello!') $ echo ${!a_list[@]} id name message |
要素の追加
要素の追加は配列と同じように行えます。
個別で追加する場合:
1 |
$ a_list[from]=Hiroshima |
まとめて追加する場合:
1 |
$ a_list+=([email]='taro@example.com' [tel]='xxx-xxxx-xxxx') |
要素の更新
要素の更新も配列と同じ感覚です。
1 2 3 4 5 |
$ echo ${a_list[from]} Hiroshima $ a_list[from]=Tokyo $ echo ${a_list[from]} Tokyo |
要素の削除
要素の削除も配列のインデックスの代わりにキー名を指定すればできます。
1 2 3 4 5 |
$ echo ${a_list[from]} Tokyo $ unset a_list[from] $ echo ${a_list[from]} # <= 要素が削除されている |
連想配列のコピー
連想配列のコピーは単純には行かないみたいです。
配列のようにコピーしても、生成されるのは連想配列の値を持った配列になります。
1 2 3 4 5 |
$ a_list_new=("${a_list[@]}") $ echo ${a_list_new[@]} xxx-xxxx-xxxx 5 Taro taro@example.com Hello! # <= 値はコピーされても $ echo ${!a_list_new[@]} 0 1 2 3 4 # <= キー名がインデックスIDになってしまっている・・ |
まとめ
- 連想配列の宣言は
declare -A
をつけて行う - 要素の表示、追加、更新、削除は配列のインデックスをキー名に変えるだけ
- 連想配列のコピーは配列のように行っても生成されるのはただの配列