在bash 3.x中按值查找数组索引

时间:2017-01-26 17:18:00

标签: arrays bash

我将此脚本称为:./script_name 604

#!/bin/bash

switchedChannel=($1)
channelArray=('108' '162' '163' '604' '141' '113')

for array_item in "${channelArray[@]}"; do
    if [[ $array_item == ${switchedChannel[0]} ]] then
        "$array_item MATCHES"
    fi
done

有没有办法让array_item的索引匹配(或以其他方式获取数组中匹配项的位置),而不是简单地使用var作为计数器并使用它来进行迭代?

总会有匹配,但数组值是唯一的,因此只有一个匹配。

(我问,因为我需要对不匹配的数组项做一些事情,所以我的想法是从数组中删除匹配的项。我可以将不匹配的项移动到一个新的数组,这对于一个简短的列表,但最好在匹配完成后立即终止循环。)

1 个答案:

答案 0 :(得分:4)

"${!array[@]}"将迭代索引,而不是值。

#!/bin/bash

switchedChannel=$1
channelArray=('108' '162' '163' '604' '141' '113')

for array_idx in "${!channelArray[@]}}"; do
    array_item=${channelArray[$array_idx]}
    if [[ $array_item = "$switchedChannel" ]] then
        "$array_item MATCHES at index $array_idx"
    fi
done

那就是说,对于你的用例 - 你在查找的任何内容都是非负整数 - 你可以做得更好:

declare -a channelArray=( [108]=1 [162]=2 [163]=3 [604]=4 [141]=5 [113]=6 )
echo "${channelArray[$switchedChannel]}"

这将创建一个稀疏数组,其中键为数字108162等;值为123等。