bash - 将字符串与关联数组的键进行比较

时间:2012-02-29 21:16:51

标签: bash

考虑以下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循环动态生成的,不是手动生成的。

1 个答案:

答案 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打印手册页的章节。