Bash:if条件 – 检查元素是否存在于数组中

我想知道是否有一个有效的方法来检查一个元素是否存在于数组中的Bash?我正在寻找类似于python的东西,你会写成:
arr = ['a','b','c','d']

if 'd' in arr:
    do your thing
else:
    do something

我已经见过使用关联数组bash的解决方案Bash 4,但我想知道是否有另一个解决方案。

请理解,我知道一个平凡的解决方案是在数组中迭代,但我不想要。

你可以做:
if [[ " ${arr[*]} " == *" d "* ]]; then
    echo "arr contains d"
fi

这将给出假阳性,例如,如果你寻找“a b” – 该子字符串在连接字符串,但不是一个数组元素。这个困境将出现在你选择的任何分隔符。

最安全的方法是循环遍历数组,直到找到元素:

array_contains () {
    local seeking=$1; shift
    local in=1
    for element; do
        if [[ $element == $seeking ]]; then
            in=0
            break
        fi
    done
    return $in
}

arr=(a b c "d e" f g)
array_contains "a b" "${arr[@]}" && echo yes || echo no    # no
array_contains "d e" "${arr[@]}" && echo yes || echo no    # yes

这里是一个“更干净的”版本,你只是传递数组名称,而不是其所有的元素

array_contains2 () { 
    local array="$1[@]"
    local seeking=$2
    local in=1
    for element in "${!array}"; do
        if [[ $element == $seeking ]]; then
            in=0
            break
        fi
    done
    return $in
}

array_contains2 arr "a b"  && echo yes || echo no    # no
array_contains2 arr "d e"  && echo yes || echo no    # yes

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...