やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

bashで変数を動的参照する(配列・連想配列も)

 任意テキストと一致した名前の変数を参照する。

成果物

動的参照

- ${!...} eval
変数
配列
連想配列

 動的参照には2つの方法がある。${!...}evalだ。これを変数・配列・連想配列でやってみた。eval最強。

1. 変数

 ふつうに変数を参照すると以下。

AGE=20
echo "${AGE}"

1-1. ${!...}

 動的参照すると以下。

VNAME=AGE
AGE=20
echo "${!VNAME}"

1-2. eval

 冗長だがOK。

VNAME=AGE
AGE=20
eval echo '$'${VNAME}

2. 配列

 ふつうに参照すると以下。

AGES=( 11 22 33 )
echo ${AGES[1]}
22

2-1. ${!...}

 参照できず……。空値が返ってくる。

AGES=( 11 22 33 )
VNAME=AGES
echo "${!VNAME[1]}"

 なお、${!VNAME[0]}としたときだけ0番目の値が返ってくる。もはやバグ。だがおそらく仕様。

AGES=( 11 22 33 )
VNAME=AGES
eval echo '${'"${VNAME}"'[1]}'

2-2. eval

 参照できる! ${...[i]}(ただしset -Ceuのとき動的参照した時点で未割り当ての変数ですと怒られる)

AGES=( 11 22 33 )
VNAME=AGES
eval echo '${'"${VNAME}"'[1]}'

 配列の要素数は以下。${#...[@]}

COUNT=$(eval echo '${#'"${VNAME}"'[@]}')
echo $COUNT

 全件参照。

for ((i=0; i<$COUNT; i++)); do eval echo '${'"${VNAME}"'['"$i"']}'; done;

3. 連想配列

 ふつうに参照すると以下。

declare -A Human=([Name]=Yamada [Age]=55)
echo ${Human[Name]}
echo ${Human[Age]}

3-1. ${!...}

 参照できず……。空値が返ってくる。

declare -A Human=([Name]=Yamada [Age]=55)
VNAME=Human
echo "${!VNAME[Name]}"
echo "${!VNAME[Age]}"

3-2. eval

 参照できる! ${...[key]}(ただしset -Ceuのとき動的参照した時点で未割り当ての変数ですと怒られる)

declare -A Human=([Name]=Yamada [Age]=55)
VNAME=Human
eval echo '${'"${VNAME}"'[Name]}'
eval echo '${'"${VNAME}"'[Age]}'

 要素数は以下。${#...[@]}

COUNT=$(eval echo '${#'"${VNAME}"'[@]}')
echo $COUNT

 キー一覧の取得。${!...[@]}

KEYS="$(eval echo '${!'"${VNAME}"'[@]}')"
echo "$KEYS"

 全件参照。

for key in $KEYS; do eval echo '${'"${VNAME}"'['"$key"']}'; done;

対象環境

  • Raspbierry pi 3 Model B+
  • Raspbian stretch 9.0 2018-11-13
  • bash 4.4.12
$ uname -a
Linux raspberrypi 4.14.98-v7+ #1200 SMP Tue Feb 12 20:27:48 GMT 2019 armv7l GNU/Linux