Check if a Bash array contains a value

前端 未结 30 2732
执笔经年
执笔经年 2020-11-22 07:14

In Bash, what is the simplest way to test if an array contains a certain value?

30条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-11-22 07:54

    This approach has the advantage of not needing to loop over all the elements (at least not explicitly). But since array_to_string_internal() in array.c still loops over array elements and concatenates them into a string, it's probably not more efficient than the looping solutions proposed, but it's more readable.

    if [[ " ${array[@]} " =~ " ${value} " ]]; then
        # whatever you want to do when array contains value
    fi
    
    if [[ ! " ${array[@]} " =~ " ${value} " ]]; then
        # whatever you want to do when array doesn't contain value
    fi
    

    Note that in cases where the value you are searching for is one of the words in an array element with spaces, it will give false positives. For example

    array=("Jack Brown")
    value="Jack"
    

    The regex will see "Jack" as being in the array even though it isn't. So you'll have to change IFS and the separator characters on your regex if you want still to use this solution, like this

    IFS=$'\t'
    array=("Jack Brown\tJack Smith")
    unset IFS
    value="Jack"
    
    if [[ "\t${array[@]}\t" =~ "\t${value}\t" ]]; then
        echo "true"
    else
        echo "false"
    fi
    

    This will print "false".

    Obviously this can also be used as a test statement, allowing it to be expressed as a one-liner

    [[ " ${array[@]} " =~ " ${value} " ]] && echo "true" || echo "false"
    

提交回复
热议问题