bash には通常の配列(0,1,2…のインデックスでアクセスする配列)に加えて、 キーと値のペアを扱える「連想配列」があります。
「ユーザ名と年齢」、「ファイル名とパス」、「設定名と値」など、名前で値を管理したい場面で非常に便利です。
この記事では、連想配列の定義 → 参照 → 追加・変更・削除 → for 文との組み合わせ という流れでまとめています。
連想配列の基本
連想配列は、declare -A で宣言します。
declare -A ages
ages=(["taro"]=20 ["jiro"]=30 ["saburo"]=25)上記連想配列のキーは「taro、jiro、saburo」、値は「20、30、25」になります。
キーや値はクォーテーションで囲むことで、スペースや特殊文字による予期せぬ動作を防ぎやすくなります。
例えば以下の場合、単語が分割され2つの引数になるため、”log”がコマンドと見なされエラーになります。
declare -A config
config[path]=/var/log/error log 正しくは:
config["path"]="/var/log/error log"また、キーや値には変数を使うことができます。
# 変数宣言
name="taro"
age="20"
# 変数をキーと値に代入。連想配列宣言時に値を入力することもできる
declare -A ages=(
["${name}"]=${age}
)
echo ${!ages[@]} # taro
echo ${ages["${name}"]} # 20ダブルクォーテーションで囲まれている場合は変数が展開されます。
通常は変数展開できるダブルクォーテーションを使い、変数展開や特殊文字展開を抑止したい場合にシングルクォーテーションを使います。
値の参照
値は対となるキーを指定することで参照できます。
echo "${ages["taro"]}" # 20
echo "${ages["jiro"]}" # 30全キー・全値の展開
全キー一覧:
echo "${!ages[@]}" # taro jiro saburo全値一覧:
echo "${ages[@]}" # 20 30 25要素の追加・変更・削除
追加:
新しいキーと値を指定します。
ages["shiro"]="28"変更:
既存のキーに値を設定します。
ages["jiro"]="31"削除:
連想配列はキーを指定して削除できるため、通常配列より扱いやすいです。
unset 'ages["taro"]'
echo "${!ages[@]}" # jiro saburo shirofor 文との組み合わせ
1.キーをループして値を参照する
for key in "${!ages[@]}"; do
echo "name: $key, age: ${ages["$key"]}"
done実行結果:
name: taro, age: 20
name: jiro, age: 30
name: saburo, age: 25
name: shiro, age: 282.値だけをループする
for age in "${ages[@]}"; do
echo "age: $age"
done実行結果:
age: 20
age: 30
age: 25
age: 28実務で使うパターン
1.アプリの設定値を扱う
設定値を扱うconfig連想配列を作成し、各値を管理しています。
declare -A config
config=(
["host"]="localhost"
["port"]="8080"
["mode"]="debug"
)
for key in "${!config[@]}"; do
echo "$key = ${config["$key"]}"
done実行結果:
port = 8080
mode = debug
host = localhost2.ファイルパスを管理する
以下ではファイルのパスを扱うfiles連想配列を作成し、ファイルパスを管理しています。
declare -A files
files=(
["error"]="/var/log/error.log"
["access"]="/var/log/access.log"
)
echo "${files["error"]}" # /var/log/error.log

コメント