1. TOPTOP
  2. Webサービス
  3. Linux

シェルスクリプトの連想配列では明示的な宣言コマンド “delcare -A”が必要

shellscript_a_array_delcare

シェルスクリプトの学習で連想配列について調べていると、興味深いことが分かりました。シェルスクリプトにおいて連想配列を定義するときは、必ずその配列変数について、”delcare -A“で明示的に宣言する必要があります。

配列の場合

まず配列の場合を考えて見ましょう。配列は明示的な宣言コマンドは、使っても使わなくても定義できます。下記の2つのスクリプト(array.sh)はともに同じ実行結果を返します。

明示的宣言をする場合

#!/bin/bash
declare -a fruits=(orange grape apple)
fruits=(orange grape apple)

fruits+=(melon banana)
echo ${fruits[@]}
$ ./array.sh
orange grape apple melon banana

明示的な宣言をしない場合

#!/bin/bash
fruits=(orange grape apple)

fruits+=(melon banana)
echo ${fruits[@]}
$ ./array.sh
orange grape apple melon banana

連想配列の場合

一方、連想配列は配列の場合と異なり、その変数について連想配列であることを明示的に宣言しなければなりません。下記の2つのスクリプト(a-array.sh)では実行結果が異なります。なお、宣言コマンドのオプションは、大文字で”-A”を使います(配列の場合は”-a”オプションを使います)。

明示的宣言をする場合

#!/bin/bash
declare -A fruits=([name]=apple [price]=100)

echo ${fruits[name]}
echo ${fruits[price]}
./a-array.sh
apple
100

明示的な宣言をしない場合

#!/bin/bash
fruits=([name]=apple [price]=100)

echo ${fruits[name]}
echo ${fruits[price]}
$ ./a-array.sh
100
100

他のプログラミング言語は分かりませんが、確かPHPでは連想配列について明示的な宣言は必要でなかったように思います。シェルスクリプトで連想配列を定義するときは、変数の前に必ず”delcare -A”コマンドを付けるようにしましょう。