Рассмотрим следующий код Баш:Баш - сравнить строку с ключами ассоциативного массива
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
. Поскольку это прямо сейчас, с нашей текущей настройкой, есть 6 доступных опций, созданных из циклов for, но у этого есть потенциал для роста, поэтому я не хочу делать это статической проверкой и должен менять сценарий каждый время добавляется дополнительный файл в ${ASSET_DIR}/enterprise
. Я предполагаю, что оператор if в порядке, но я не уверен, как бы проверить, соответствует ли он ключу из ассоциативного массива.
РЕДАКТИРОВАТЬ:
В качестве примера, предположим, что первый цикл динамически ассоциативный массив $VERS
с четырьмя значениями:
$ 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_INPUT
), которая, мы надеемся, будет 1, 2, 3 или 4. Как я могу проверить, что значение $VERS_INPUT
равно либо 1, 2, 3, либо 4. Очевидно, что это произвольный пример, так как мой список в настоящее время имеет 6 доступных опций и будет только расти дальше. Я хочу сделать это как можно более динамичным, так как 1, 2, 3, 4 и т. Д. ... динамически генерируется из первого цикла for и не генерируется вручную.
Не разбирайте вывод 'ls', если вы можете его избежать. Пробелом является наш враг. Пробелы в именах файлов - это огромный враг. 'для FILE в $ {ASSET_DIR}/enterprise/*; do' должен это делать. Позаботьтесь о скрытых файлах. –