シェルスクリプトでハッシュみたいなこと・・はできない

追記=

トラックバックをいただいていたので改めてエントリを見てみたら、何となくとても違和感があったので、検証してみたらやっぱりおかしい事を書いていました。

ここで説明しているのはあくまで「evalでのシングルクォート展開」でしかなくて、全く「ハッシュみたいなもの」ではありません。

eval echo ${array[$hoge]}
eval echo ${array[$foo]}
eval echo ${array[$var]}

としてみるとわかるのですが

HOGEhogehoge
HOGEhogehoge
HOGEhogehoge

このように全て一つ目の要素になってしまい、ハッシュのようにキーから値をとってくることはできません。

for tmp in ${array[@]}
do
  eval echo ${tmp}
done

だと全ての要素をとってきていますが、これは配列を全て出しているに過ぎなくて、やってることは

eval echo ${array[0]}
eval echo ${array[1]}
eval echo ${array[2]}

と同じです。

誤ったエントリでしたので訂正いたします。


シェルスクリプトでハッシュみたいなことをする場面ってそんなにないと思うけど、一応知っておくと良いのかも。

#!/bin/sh

array=('HOGE$hoge' '$foo' '$var')

hoge="hogehoge"
foo="foofoo"
var="varvar"

echo ${array[0]}
echo ${array[$hoge]}

eval echo ${array[0]}
eval echo ${array[$hoge]}

for tmp in ${array[@]}
do
  eval echo ${tmp}
done

実行結果

HOGE$hoge
HOGE$hoge
HOGEhogehoge
HOGEhogehoge
HOGEhogehoge
foofoo
varvar

evalはシングルクォートで囲んだ文字列内の変数を変数展開します(evalなしだと普通にそのままの文字列として扱う)。

実際やってることは配列にシングルクォート配列を格納しているに過ぎないので、当然、普通にインデクスを指定しても同様に変数展開された値にアクセスできますね。