プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

シェルスクリプトで引数をハッシュの文字列として展開できないかな・・と思考錯誤しています。

. ./test.sh abc

#!/bin/bash

declare -A abc # -Aでハッシュ宣言
abc["0"]="0"
abc["1"]="1"
abc["2"]="2"
abc["3"]="3"
abc["4"]="4"
abc["5"]="5"
abc["6"]="6"
abc["7"]="7"
abc["8"]="8"
abc["9"]="9"
abc["10"]="10"

declare -A xyz # -Aでハッシュ宣言
xyz["0"]="0"
xyz["1"]="1"
xyz["2"]="2"
xyz["3"]="3"
xyz["4"]="4"
xyz["5"]="5"
xyz["6"]="6"
xyz["7"]="7"
xyz["8"]="8"
xyz["9"]="9"
xyz["10"]="10"

declare -A zzz # -Aでハッシュ宣言
zzz["0"]="0"
zzz["1"]="1"
zzz["2"]="2"
zzz["3"]="3"
zzz["4"]="4"
zzz["5"]="5"
zzz["6"]="6"
zzz["7"]="7"
zzz["8"]="8"
zzz["9"]="9"
zzz["10"]="10"

if [ "$1" = "abc" ];
then
echo "$1:${abc[$(( ${RANDOM} * 11 / 32768 ))]}"
elif [ "$1" = "xyz" ];
then
echo "$1:${xyz[$(( ${RANDOM} * 11 / 32768 ))]}"
else
echo "$1:${zzz[$(( ${RANDOM} * 11 / 32768 ))]}"
fi

もしハッシュが増える場合、elifの部分を沢山書いていくのではなく、
下記のような形にすっきりさせたいと思っているのですが、$1の値をハッシュとして展開させるやり方がわかりません。

if [ "$1" ];
then
#ここの部分で$1をハッシュとして展開させる為の記述方法がわかりません。
#下記のいずれも「: 誤った代入です」となってしまいます
echo "$1:${$${1}[$(( ${RANDOM} * 11 / 32768 ))]}"
echo "$1:${${1}[$(( ${RANDOM} * 11 / 32768 ))]}"
echo "$1:${${1[$(( ${RANDOM} * 11 / 32768 ))]}}"
echo "$1:${$1[$(( ${RANDOM} * 11 / 32768 ))]}"
else
echo "$1:${zzz[$(( ${RANDOM} * 11 / 32768 ))]}"
fi

どなた様か、ご教授願えませんでしょうか。よろしくお願いしたします。

A 回答 (3件)

eval

    • good
    • 0
この回答へのお礼

一番最初の回答 evalでぐぐってみて、
evalをヒントに恐る恐るやってみたら、下記の形でうまくいきました。

eval echo "$1:\${$1[$(( ${RANDOM} * 11 / 32768 ))]}"

ありがとうございます。

お礼日時:2012/07/24 20:24

これでよろしいでしょうか?



case "$1" in
abc|xyz)
 eval "echo \"\$1:\${$1[\$(( \${RANDOM} * 11 / 32768 ))]}\"" ;;
*)
 echo "$1:${zzz[$(( ${RANDOM} * 11 / 32768 ))]}" ;;
esac
    • good
    • 0
この回答へのお礼

スクリプトの記述まで頂きありがとうございます。

実行してみたのですが、エラーとなってしまっていました。

ありがとうございました。また宜しくお願い致します。

お礼日時:2012/07/24 20:02

あるいは、hash["abc0"]="0" などと、$1まで含めたものをキーにする

    • good
    • 0
この回答へのお礼

なるほどですね、hashのキーに入れるのは、思いつきませんでした。

ありがとうございます。

お礼日時:2012/07/24 20:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!