如何根据数组的索引从数组中提取值

时间:2019-11-12 15:33:34

标签: arrays bash shell

我有3个数组。第一个包含视为“禁止”的字符串。 第二个包含随机单词(最初是一条消息),其中一些单词可以在第一个数组中引用。 第三个数组包含数字。

我想做的是首先比较两个第一个数组以检查消息中的哪些单词(第二个数组)是“禁止”单词(第一个数组),然后将第三个数组的数字添加到变量中实际与禁止字对应的内容如下:

array1:狗猫马

array3:40 60 10

array2:我喜欢我的狗

我想我已经用这段脚本实现了第一步:

array1=(dog cat horse)
array2=(I like my dog)
array3=(40 60 10)

myarray=()

for item1 in "${array1[@]}"; do
    for item2 in "${array2[@]}"; do
        if  [[ $item1 == $item2 ]]; then
            myarray+=( $item1 )
            break
        fi
    done
done

echo ${myarray[@]}

结果:

dog

但是我仍然找不到一种方法来包含我的第三个数组,并提取与消息所涉及的第一个数组中的禁忌词具有相同索引的数字。

1 个答案:

答案 0 :(得分:3)

您要遍历数组的索引,而不是数组元素:

sum=0
for i in "${!array1[@]}"; do    # note the `!` there
  forbidden=${array[i]}
  for word in "${array2[@]}"; do
    if [[ "$word" == "$forbidden" ]]; then
      (( sum += ${array3[i]} ))
    fi
  done
done
echo $sum

另一种方法是使用 associative 数组:将动物直接映射到值,而不是2个单独的数组。另外,它不需要嵌套循环。

declare -A forbidden=([dog]=40 [cat]=60 [horse]=10)
message=(I like my dog)
sum=0

for word in "${message[@]}"; do
  if [[ -n "${forbidden[$word]}" ]]; then
    (( sum += ${forbidden[$word]} ))
  fi
done

您应该尝试使用比array1等更多的描述性变量名