开发者社区> 问答> 正文

检查Bash数组中是否存在元素

我想知道是否有一种有效的方法来检查Bash数组中是否存在元素?我正在寻找类似于Python的功能:

arr = ['a','b','c','d']

if 'd' in arr: do your thing else: do something 我见过针对Bash 4+使用针对bash的关联数组的解决方案,但是我想知道是否还有其他解决方案。

请理解,我知道微不足道的解决方案是在数组中进行迭代,但我不希望这样做。 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-09 12:21:09 477 0
1 条回答
写回答
取消 提交回答
  • 您可以这样做:

    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 对于关联数组,有测试一个非常整洁的方式,如果该数组包含一个给定的关键:在-v运营商

    $ declare -A arr=( [foo]=bar [baz]=qux ) $ [[ -v arr[foo] ]] && echo yes || echo no yes $ [[ -v arr[bar] ]] && echo yes || echo no no 请参见手册中的6.4 Bash条件表达式。

    2020-02-10 16:06:28
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载