我正在尝试替换“#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
答案 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骗术的一般态度。用技术术语来说,手动迭代元素没有任何缺点。