如何正确地在数组中进行“不等于”字符串比较,然后在bash中删除该元素

问题描述 投票:0回答:1

我试图对数组中每个字符串元素的最后三个字符进行 != 字符串比较,然后如果不相等则删除该元素,但它没有产生预期的结果。我确信我的代码不正确,因此我正在寻找一些有关如何纠正的指导。

我尝试了两个同时使用“==”和“!=”的示例来测试我的代码,如下所示:

数组:

array=(8669648574foo 86696485745u 231649bar 23164919a1 8594792682foo 859479268209t)
  1. 首先运行“==”
    for ((i=0; i<${#array[@]}; i++)); do
        chomp=${array[i]: -3}
        echo chomp: $chomp
        if [[ $chomp == "foo" ]] || [[ $chomp == "bar" ]]; then
            echo "i: $i, element: ${array[i]}"
            delete=${array[i]}
            echo ${array[@]/$delete}
            array=( "${array[@]/$delete}" )
        fi   
    done
    array=( "${array[@]}" )
    echo "First run: ${array[@]}"

输出:(代码按预期工作,删除了 foo/bar 元素 - 但这不是我想要的)

chomp: foo
i: 0, element: 8669648574foo
86696485745u 231649bar 23164919a1 8594792682foo 859479268209t
chomp: 45u
chomp: bar
i: 2, element: 231649bar
86696485745u 23164919a1 8594792682foo 859479268209t
chomp: 9a1
chomp: foo
i: 4, element: 8594792682foo
86696485745u 23164919a1 859479268209t
chomp: 09t
First run:  86696485745u  23164919a1  859479268209t # expected result

第二次运行“!=”

    for ((i=0; i<${#array[@]}; i++)); do
        chomp=${array[i]: -3}
        echo chomp: $chomp
        if [[ $chomp != "foo" ]] || [[ $chomp != "bar" ]]; then
            echo "i: $i, element: ${array[i]}"
            delete=${array[i]}
            echo ${array[@]/$delete}
            array=( "${array[@]/$delete}" )
        fi   
    done
    array=( "${array[@]}" )
    echo "Second run: ${array[@]}"

输出:(代码未按预期工作)

chomp: foo
i: 0, element: 8669648574foo
86696485745u 231649bar 23164919a1 8594792682foo 859479268209t
chomp: 45u
i: 1, element: 86696485745u
231649bar 23164919a1 8594792682foo 859479268209t
chomp: bar
i: 2, element: 231649bar
23164919a1 8594792682foo 859479268209t
chomp: 9a1
i: 3, element: 23164919a1
8594792682foo 859479268209t
chomp: foo
i: 4, element: 8594792682foo
859479268209t
chomp: 09t
i: 5, element: 859479268209t

Second run: # no output, deletes all elements.

注意:我也尝试使用

unset array[$i]
,但我超出了帖子大小,因此删除了这些示例。

问:如何删除不等于 foo/bar 的数组元素?

arrays bash
1个回答
0
投票

这是您的算法中的一个简单错误: 由于

chomp
不能同时是
foo
bar
,因此命令

[[ $chomp != "foo" ]] || [[ $chomp != "bar" ]]

永远都是真的。如果你写了

[[ $chomp != "foo" ]] && [[ $chomp != "bar" ]]

您将选择既不是 foo 也不是 bar 的元素。

© www.soinside.com 2019 - 2024. All rights reserved.