Bash脚本中如何获取指定值在数组内对应的索引位置
问题原因
你原有代码无法获取位置索引的核心问题是循环遍历的对象错了:for i in ${array[@]} 会直接遍历数组的元素值,循环变量i拿到的永远是11、13、25这类实际存储的内容,不是元素对应的位置下标,所以匹配成功后给result赋值$i,得到的自然是匹配到的元素值25,而非目标位置3。
另外你把result初始值设为0也有隐患:如果目标值刚好是数组第一个元素(下标为0),你后续没法区分是「没匹配到元素返回初始值0」还是「匹配到了第一个元素下标0」。
修正代码
把遍历逻辑改成遍历数组下标即可,完整可运行代码如下:
value=25 array=( 11 13 17 25 36 ) result=-1 # 初始值设为数组不可能存在的非法下标,方便后续判断是否匹配成功 # ${!array[@]} 是Bash专门用来获取数组所有下标的语法,不会返回元素值 for idx in "${!array[@]}"; do if [[ ${array[$idx]} -eq $value ]]; then result=$idx break # 匹配到目标后直接终止循环,不需要浪费资源遍历剩余元素 fi done
运行上述代码后,result的输出值就是你需要的3。
补充说明
- 如果你需要的是日常计数逻辑里1开头的位置(比如示例中25是第4个元素),只需要把赋值行修改为
result=$((idx + 1))即可。 - 如果数组中存在多个和
value相等的重复元素,上述代码默认返回第一个匹配元素的下标;如果需要获取最后一个匹配项的位置,删掉循环里的break语句即可。 - 遍历下标时给
${!array[@]}加上双引号,是为了兼容数组元素包含空格、特殊字符的场景,避免内容被Bash错误拆分。
内容的提问来源于stack exchange,提问作者itsLOKO
相关产品推荐
相关产品推荐

