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