Check if a Bash array contains a value Check if a Bash array contains a value bash bash

Check if a Bash array contains a value


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 valuefiif [[ ! " ${array[*]} " =~ " ${value} " ]]; then    # whatever you want to do when array doesn't contain valuefi

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="|"array=("Jack Brown${IFS}Jack Smith")value="Jack"if [[ "${IFS}${array[*]}${IFS}" =~ "${IFS}${value}${IFS}" ]]; then    echo "true"else    echo "false"fiunset IFS # or set back to original IFS if previously set

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"


Below is a small function for achieving this. The search string is the first argument and the rest are the array elements:

containsElement () {  local e match="$1"  shift  for e; do [[ "$e" == "$match" ]] && return 0; done  return 1}

A test run of that function could look like:

$ array=("something to search for" "a string" "test2000")$ containsElement "a string" "${array[@]}"$ echo $?0$ containsElement "blaha" "${array[@]}"echo $?1


One-line solution

printf '%s\n' "${myarray[@]}" | grep -P '^mypattern$'

Explanation

The printf statement prints each element of the array on a separate line.

The grep statement uses the special characters ^ and $ to find a line that contains exactly the pattern given as mypattern (no more, no less).


Usage

To put this into an if ... then statement:

if printf '%s\n' "${myarray[@]}" | grep -q -P '^mypattern$'; then    # ...fi

I added a -q flag to the grep expression so that it won't print matches; it will just treat the existence of a match as "true."