考虑以下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语句是有序的,但我不确定如何检查它是否与关联数组中的键匹配。
修改
举一个例子,假设第一个for循环用四个值动态生成关联数组$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显然,这是一个任意的例子,因为我的列表目前有6个可用选项,并且只会进一步增长。我想让它尽可能动态,因为1,2,3,4等等是从第一个for循环动态生成的,不是手动生成的。
答案 0 :(得分:1)
我希望我理解你的问题:将用户输入与未知长度数组的索引相匹配。此测试代码有效:
#!/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
终止。
这不是你要求的,但它是一个shell buildin,可能对你有用help select
打印手册页的章节。