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

Qua*_*cht 63 arrays bash shell search

我想知道是否有一种有效的方法来检查Bash中的数组中是否存在元素?我正在寻找类似于我在Python中可以做的事情,例如:

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

if 'd' in arr:
    do your thing
else:
    do something
Run Code Online (Sandbox Code Playgroud)

我已经看到使用关联数组为Bash 4+进行bash的解决方案,但我想知道是否还有其他解决方案.

请理解我知道琐碎的解决方案是迭代数组,但我不希望这样.

gle*_*man 88

你可以这样做:

if [[ " ${arr[*]} " == *" d "* ]]; then
    echo "arr contains d"
fi
Run Code Online (Sandbox Code Playgroud)

这将给出误报,例如,如果您查找"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
Run Code Online (Sandbox Code Playgroud)

这是一个"更干净"的版本,您只需传递数组名称,而不是所有元素

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
Run Code Online (Sandbox Code Playgroud)

  • 考虑引用“$seeking”,这样它就不会被视为模式。 (2认同)

小智 30

除了显而易见的警告,如果您的阵列实际上与上面的阵列相似,那么您可以这样做

if [[ ${arr[*]} =~ d ]]
then
  do your thing
else
  do something
fi
Run Code Online (Sandbox Code Playgroud)

  • +1用于教授新事物.但是`d`也会匹配`xdy`. (3认同)
  • @OlafDietsche这可以通过编写它来解决`if [[$ {arr [*]} =〜$(echo'\ <d \>')]]`([来源](/sf/ask/685489171/ /不-的bash支持单词边界正则表达式)) (3认同)

Mar*_*luk 15

1)初始化数组arr并添加元素

2)设置变量进行搜索 SEARCH_STRING

3)检查您的数组是否包含元素

arr=()
arr+=('a')
arr+=('b')
arr+=('c')

SEARCH_STRING='b'

if [[ " ${arr[*]} " == *"$SEARCH_STRING"* ]];
then
    echo "YES, your arr contains $SEARCH_STRING"
else
    echo "NO, your arr does not contain $SEARCH_STRING"
fi
Run Code Online (Sandbox Code Playgroud)

  • 这是该帖子对我有用的唯一回复,谢谢! (2认同)

jes*_*her 12

如果数组元素不包含空格,则另一个(可能更易读)解决方案是:

if echo ${arr[@]} | grep -q -w "d"; then 
    echo "is in array"
else 
    echo "is not in array"
fi
Run Code Online (Sandbox Code Playgroud)