2012-02-29 14 views
1

は、以下のbashコード検討連想配列のキーに対する文字列を比較する:バッシュ -

echo -e "\nThe following versions are available for install:" 
declare -A VERS 
CNT=0 
for FILE in `ls ${ASSET_DIR}/enterprise`; do 
    let "CNT++" 
    VERS_STR=`sed -e 's/^file-\([0-9].[0-9].[0-9]\).zip/\1/' <<< ${FILE}` 
    VERS[${CNT}]=${VER_STR} 
done 
for i in ${!VERS[@]}; do 
    echo " ${i} - ${VERS[${i}]}" 
done 
echo -n "Which version do you want to install?: " 
read VERS_INPUT 

$VERS_INPUTは、連想配列$VERSのキーのいずれかに等しくなければなりません。 $VERS_INPUTの値が$VERSのいずれかのキーと等しいことを確認するにはどうすればよいですか。現在の設定では、現在の設定では、forループから生成される6つのオプションがありますが、これは成長する可能性があります。したがって、静的なチェックを行い、毎回スクリプトを変更する必要はありません追加のファイルを入れる時間は${ASSET_DIR}/enterpriseです。 if文が順番に並んでいると推測しますが、連想配列のキーとどのように一致するかを確認する方法はわかりません。


EDIT:

$ echo $ENV["1"] 
3.4.3 

$ echo $ENV["2"] 
3.4.4 

$ echo $ENV["3"] 
3.4.5 

$ echo $ENV["4"] 
3.4.6 

ユーザが入力するように促される。

例を与えるために、ループの最初の動的四つの値を有する連想配列$VERSを生成言うことができます(変数$VERS_INPUTに割り当てられている)値が1,2,3、または4になるようにしてください。$VERS_INPUTの値が1,2,3、または4のいずれかであることを確認するにはどうすればいいですか?任意の例です。私のリストは現在6つのオプションがあり、今後さらに成長する予定です。 1、2、3、4などが最初のforループから動的に生成され、手動で生成されないので、これを可能な限り動的にしたいと考えています。

+0

'ls'の出力を解析できない場合は、解析しないでください。空白は私たちの敵です。ファイル名の空白は大規模な敵です。 '$ {ASSET_DIR}/enterprise/*のFILEのための';それはすべきだ。隠しファイルに注意してください。 –

答えて

1

私はあなたの質問を理解して欲しいと思います。不明な長さの配列のインデックスにユーザー入力を一致させてください。このtestcode作品:

#!/bin/bash 
VERS=(1.1.1 1.1.2 1.2.1 1.2.2 1.3.1 terminate) 

select val in ${VERS[*]} 
do 
    case $val in 
     terminate) 
     echo "... done" 
     break 
     ;; 
     [0-9]*) 
     echo "match " $val 
     ;; 
     *) 
     echo "fail (empty:)" $val 
     ;; 
    esac  
done 

インタラクティブ出力:

./version.sh 
1) 1.1.1  3) 1.2.1  5) 1.3.1 
2) 1.1.2  4) 1.2.2  6) terminate 
#? 0 
fail (empty:) 
#? 1 
match 1.1.1 
#? 6 
... done 

をユーザ入力1〜5の場合は、関連する配列要素が印刷されます。

入力は6で終了します。

あなたが求めているのは正確ではありませんが、それはシェルのビルドンであり、おそらくあなたにとって役に立ちます。help selectはマンページの章を出力します。

+0

私は、任意の例を用いて、元の質問をさらに明確に編集した。配列は動的に生成され、そのキーに関連付けられた値ではなく、配列内のキーと文字列を比較したい。 – Scott

+0

@Scott:私の答えを更新しました –

+0

私は間違っていないとすれば、 'do'と' done'の間に、文字列が空でないこと、そしてそれが3桁bash if文のパターン?実現可能な解決策であると私は考えて正しいでしょうか? – Scott