LoginSignup
55
44

More than 3 years have passed since last update.

bashで連想配列

Last updated at Posted at 2019-11-17

連想配列のセット

連想配列宣言

変数を連想配列として扱うには、変数宣言で-Aオプションを利用します。

連想配列の宣言
declare -A musics

初期セット

連想配列の宣言と同時に連想配列のセットも同時に行う場合は()で囲みます。

連想配列初期セット
declare -A musics=(
        ["ultra soul"]="2001"
        ["OCEAN"]="2005"
        ["BANZAI"]="2004"
        ["RED"]="2015"
        ["GIFT"]="2008"
)

連想配列の追加

連想配列の追加は以下のような指定します。

連想配列追加
musics["ARIGATO"]="2004"

連想配列の値変更

連想配列の値を変更する場合は、追加と同じ書き方になります。

連想配列の値変更
declare -A musics=(
        ["OCEAN"]="2006"
)
musics["OCEAN"]="2005"

連想配列の削除

連想配列に設定したものを削除する場合は、unsetを利用します。

連想配列の削除
unset musics["GIFT"]

連想配列の表示

指定したキーの値を取得

連想配列から指定したキーの値を取得する場合は${連想配列変数["キー"]}のように指定します。

指定したキーの値を取得
echo "${musics["ultra soul"]}"

設定されている配列数を数える

連想配列に設定されている配列の数を数える場合は${#連想配列変数[@]}のようにします。

指定したキーの値を取得
echo "count:${#musics[@]}"

キーが存在しているか確認

連想配列に指定したキーが存在するか確認する場合は、if文に-nオプションまたは-zオプションを利用してキーを利用して連想配列から取り出せるかを確認します。

キーが存在する場合処理
declare -A musics=(
        ["ultra soul"]="2001"
)

if [ -n "${musics["ultra soul"]}" ]; then
    echo "exist"
fi
if [ -n "${musics["GIFT"]}" ]; then
    echo "not exist"
fi

# existのみが表示される
キーが存在しない場合処理
declare -A musics=(
        ["ultra soul"]="2001"
)

if [ -z "${musics["ultra soul"]}" ]; then
    echo "exist"
fi
if [ -z "${musics["GIFT"]}" ]; then
    echo "not exist"
fi

# not existのみが表示される

連想配列ループ

キーを表示する

連想配列にセットされているキーをループして表示する。
${!連想配列名[@]}を利用します。

キーを表示
declare -A musics=(
        ["ultra soul"]="2001"
        ["OCEAN"]="2006"
)

for music in "${!musics[@]}"; do
    echo "${music}"
done

# 処理結果
# ultra soul
# OCEAN

値を表示する

連想配列にセットされている値をループして表示する。
${連想配列名[@]}を利用します。!マークをつけないのがポイントです。

キーを表示
declare -A musics=(
        ["ultra soul"]="2001"
        ["OCEAN"]="2006"
)

for music in "${musics[@]}"; do
    echo "${music}"
done

# 処理結果
# 2001
# 2006

キーと値を同時に表示する

連想配列にセットされているキーと値のセットを同時に表示する場合は、キーを表示する時のループを利用して取り出します。

キーを表示
declare -A musics=(
        ["ultra soul"]="2001"
        ["OCEAN"]="2006"
)

for music in "${!musics[@]}"; do
    echo "${music}:${musics[${music}]}"
done

# 処理結果
# ultra soul:2001
# OCEAN:2005

上記全てをまとめた結果

以上で終わりですが、上記をまとめたshellを乗せておきます。

#!/bin/bash

# set
declare -A musics=(
    ["ultra soul"]="2001"
    ["OCEAN"]="2006"
    ["BANZAI"]="2004"
    ["RED"]="2015"
    ["GIFT"]="2008"
)

musics["ARIGATO"]="2004"
musics["OCEAN"]="2005"
unset musics["GIFT"]

# read
echo "${musics["ultra soul"]}"
echo "count:${#musics[@]}"

echo "# -n option"
if [ -n "${musics["ultra soul"]}" ]; then
    echo "exist"
fi
if [ -n "${musics["GIFT"]}" ]; then
    echo "not exist"
fi

echo "# -z option"
if [ -z "${musics["ultra soul"]}" ]; then
    echo "exist"
fi
if [ -z "${musics["GIFT"]}" ]; then
    echo "not exist"
fi

# for
echo "# for key loop"
for music in "${!musics[@]}"; do
    echo "${music}"
done

echo "# for value loop"
for music in "${musics[@]}"; do
    echo "${music}"
done

echo "# for key/value loop"
for music in "${!musics[@]}"; do
    echo "${music}:${musics[${music}]}"
done
実行結果
2001
count:5
# -n option
exist
# -z option
not exist
# for key loop
OCEAN
ARIGATO
BANZAI
ultra soul
RED
# for value loop
2005
2004
2004
2001
2015
# for key/value loop
OCEAN:2005
ARIGATO:2004
BANZAI:2004
ultra soul:2001
RED:2015
55
44
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
55
44