連想配列の基本的な使い方

連想配列(値の設定と取得)

code
# 連想配列の宣言
declare -A hash

# 連想配列に値を設定
hash[りんご]=200
hash[みかん]=120

echo '連想配列の値を取得'
echo "りんご : ${hash[りんご]}"
echo "みかん : ${hash[みかん]}"
stdout
連想配列の値を取得
りんご : 200
みかん : 120

連想配列(値とキーのループ)

code
# 連想配列の宣言
declare -A hash=(
  [りんご]=200
  [みかん]=120
)

echo "------------------------------"
echo "連想配列の値をループ"
for val in "${hash[@]}"; do
  echo "${val}"
done

echo "------------------------------"
echo "連想配列のキーをループ"
for key in "${!hash[@]}"; do
  echo "${key} : ${hash[$key]}"
done
stdout
------------------------------
連想配列の値をループ
120
200
------------------------------
連想配列のキーをループ
みかん : 120
りんご : 200

連想配列(要素数の取得とキーの存在チェック)

code
# 連想配列の宣言
declare -A hash=(
  [りんご]=200
  [みかん]=120
)

echo '------------------------------'
echo '連想配列の要素数を取得'
echo "要素数 : ${#hash[@]}"

echo '------------------------------'
echo '連想配列にキーが存在するかチェック'
for key in みかん りんご バナナ; do
  if [[ -n "${hash[${key}]}" ]]; then
    echo "${key}は存在します"
  else
    echo "${key}は存在しません"
  fi
done
stdout
------------------------------
連想配列の要素数を取得
要素数 : 2
------------------------------
連想配列にキーが存在するかチェック
みかんは存在します
りんごは存在します
バナナは存在しません
code
# -u 設定されていない変数やパラメータを展開しようとした場合、エラーにする
set -u

# 連想配列の宣言
declare -A hash=( [A]=200 )

# :- でデフォルト値に置換しているのでエラーにならない
if ! [[ -n "${hash[B]:-}" ]]; then
  echo "1. Bは存在します"
fi

# hash[B]は設定されていないのでエラーになる
if ! [[ -n "${hash[B]}" ]]; then
  echo "2. Bは存在します"
fi
stdout
1. Bは存在します
stderr
line 13: hash[B]: unbound variable
code
# -u 設定されていない変数やパラメータを展開しようとした場合、エラーにする
set -u

# 連想配列の宣言
declare -A hash=( [A]=200 )

# :- でデフォルト値に置換しているのでエラーにならない
if [[ -z "${hash[B]:-}" ]]; then
  echo "1. Bは存在しません"
fi

# hash[B]は設定されていないのでエラーになる
if [[ -z "${hash[B]}" ]]; then
  echo "2. Bは存在しません"
fi
stdout
1. Bは存在しません
stderr
line 13: hash[B]: unbound variable

連想配列(値の削除)

code
# 連想配列の宣言
declare -A hash

for i in {1..10}; do
  hash["key-${i}"]="$(printf '%2s' "${i}")"
done

echo "削除前:" "${hash[@]}"

# 連想配列の要素を削除
unset hash['key-1']
unset hash['key-5']
unset hash['key-10']

echo "削除後:" "${hash[@]}"
stdout
削除前: 10  1  3  2  5  4  7  6  9  8
削除後:  3  2  4  7  6  9  8