現場で使えるシェルスクリプト入門6 連想配列を使いこなす

シェルスクリプト IT

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 shiro

for 文との組み合わせ

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: 28

2.値だけをループする

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 = localhost

2.ファイルパスを管理する
以下ではファイルのパスを扱うfiles連想配列を作成し、ファイルパスを管理しています。

declare -A files
files=(
  ["error"]="/var/log/error.log"
  ["access"]="/var/log/access.log"
)

echo "${files["error"]}"   # /var/log/error.log

コメント

タイトルとURLをコピーしました