迭代并替换数组中的元素

时间:2017-07-20 06:45:47

标签: bash

我正在尝试替换“#34; Apples"与"哈密瓜"在我的副本'阵列。我现在正在做的不是抛出错误,但复制数组中没有发生任何变化。

#!/bin/bash

fruits=("Oranges" "Apples" "Bananas" "Grapes")
echo "Original list:"
echo "${fruits[@]}"

copy=("${fruits[@]}")

for i in ${copy[@]}
do
        if [[ copy[$i] == "Apples" ]]; then
                copy[$i]="Canteloupe"
        fi
done

echo "Copied list:"
echo "${copy[@]}"

我的输出:

Original list:
Oranges Apples Bananas Grapes
Copied list:
Oranges Apples Bananas Grapes

2 个答案:

答案 0 :(得分:5)

在您的原始方法中,您循环遍历数组中的,使用该方法无法获取要替换的元素的索引。

您需要更改以修改逻辑以循环遍历数组的 indices

for i in "${!copy[@]}"; do
    if [[ ${copy[$i]} == "Apples" ]]; then
        copy[$i]="Canteloupe"
    fi
done

应该解决你的问题。

构造for i in "${!copy[@]}"; do用于循环,数组的索引从0开始到数组的大小,这使您可以替换索引中找到所需字符串的元素。

扩展答案以指出使用任何一种数组迭代方式时的差异。

循环索引

for i in "${!copy[@]}"; do 
  printf "%s\t%s\n" "$i" "${copy[$i]}"
done

打印

0       Oranges
1       Apples
2       Bananas
3       Grapes

和以上

for i in "${copy[@]}"; do 
  printf "%s\n" "$i"
done

产生

Oranges
Apples
Bananas
Grapes

答案 1 :(得分:1)

在对此similar question的公认答案中解释的解决方案可能更可取:

array=("${array[@]/Apples/Canteloupe}")

这取决于您对Bash骗术的一般态度。用技术术语来说,手动迭代元素没有任何缺点。