迭代并替换数组中的元素

nhe*_*shy 9 bash

我试图用"复制"数组中的"哈密瓜"替换"苹果"这个词.我现在正在做的不是抛出错误,但复制数组中没有发生任何变化.

#!/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[@]}"
Run Code Online (Sandbox Code Playgroud)

我的输出:

Original list:
Oranges Apples Bananas Grapes
Copied list:
Oranges Apples Bananas Grapes
Run Code Online (Sandbox Code Playgroud)

Ini*_*ian 8

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

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

for i in "${!copy[@]}"; do
    if [[ ${copy[$i]} == "Apples" ]]; then
        copy[$i]="Canteloupe"
    fi
done
Run Code Online (Sandbox Code Playgroud)

应该解决你的问题.

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


在使用任何一种数组迭代方法时,扩展答案以指出差异.

循环指数

for i in "${!copy[@]}"; do 
  printf "%s\t%s\n" "$i" "${copy[$i]}"
done
Run Code Online (Sandbox Code Playgroud)

版画

0       Oranges
1       Apples
2       Bananas
3       Grapes
Run Code Online (Sandbox Code Playgroud)

和钥匙

for i in "${copy[@]}"; do 
  printf "%s\n" "$i"
done
Run Code Online (Sandbox Code Playgroud)

生产,

Oranges
Apples
Bananas
Grapes
Run Code Online (Sandbox Code Playgroud)


Ser*_*nko 8

在这个类似问题的公认答案中解释的解决方案可能更可取:

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

这取决于您对 Bash 诡计的总体态度。在技​​术方面,手动迭代元素没有任何缺点。