arrays - 嵌套 for 循环行为 - shell 脚本

标签 arrays shell iteration nested-loops unset

有两个 shell 脚本数组。出于演示目的,第一个数组包含两个元素。这两个元素也将位于第二个数组中,并添加另一个数组。

这个嵌套 for 循环的目的是从第二个数组中删除匹配的字符串。因此,最后第三个元素应该是第二个数组中唯一的元素。

我相信:

  • 我的 for 循环语法/算法正在跳过迭代
  • 我对unset数组方法的理解不正确

请注意,我想完全删除该元素,而不仅仅是将元素留空。

代码

first_string='first'
second_string='second'
third_string='third'

strings_to_remove=()
strings_to_remove+=("$first_string")
strings_to_remove+=("$second_string")

main_array=()
main_array+=("$first_string")
main_array+=("$second_string")
main_array=("$third_string")

for i in "${main_array[@]}";    do
    echo $i
done

echo ''

for r in "${!strings_to_remove[@]}"; do
  index=''
  for i in "${!main_array[@]}"; do
    if [[ "${main_array[$i]}" = "${strings_to_remove[$r]}" ]];  then
      index=$i
    fi
  done
  if [[ $index -ne '' ]]; then
    unset main_array[$index]
    main_array=( "${main_array[@]}" )
  fi
done

echo ''

for i in "${main_array[@]}";    do
    echo "$i"
done

输出

first
second
third

first
third

应删除第一个和第二个元素,但仅删除第二个元素。我不确定算法本身或语法是否不正确。

最佳答案

问题出在这里:

[[ $index -ne '' ]]

这是进行算术测试,[[ 0 -ne '' ]] 返回 false。更改自:

index=''
...
if [[ $index -ne '' ]]; then

至:

index=-1
...
if [[ $index -ge 0 ]]; then

你就完成了。

关于arrays - 嵌套 for 循环行为 - shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35538334/

相关文章:

bash - 如何从 CSV 文件中获取每一行的第一列?

java - 关于迭代图像中每个像素的简单问题

javascript 对象中的简单计数?

css - 我正在为从左到右的动画使用 animation-iteration-count 属性 如何在动画结束后删除或隐藏 div

javascript - 相同的产品但在表中添加另一行(仅限 JavaScript)

c++ - 使用 vector (字符串)C++

c++ - 为什么允许根据用户输入声明具有大小的自动数组?

android - 在 Android 中为 OpenGL 加载大型数组数据的正确方法

linux - 删除通讯输出中的空格

python - 以编程方式获取 bash 完成选项