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

相关文章

普通模式 >G 增加当前行到文档末尾处的缩紧层级 $ 移动到本行的末尾 . 相当于一个...
原文连接: https://spacevim.org/cn/layers/lang/elixir/ 模块简介 功能特性 启用模块 快捷键 语言专属...
原文连接: https://spacevim.org/cn/layers/lang/dart/ 模块简介 功能特性 依赖安装及启用模块 启用模...
 =   赋值操作符,可以用于算术和字符串赋值 +        加法计算     -        减法运算...
1.根据包名来查看指定的APP指定数据 adb shell "top | grep com.xxx.xxx" 由于这样打印出来的数...
ctrl+F 向下翻页 ctrl+B 向下翻页 u 取消最近一次操作 U 取消当前行的操作 ZZ 保存当前内容并退出 gg 跳...