Skip to main content

Raymii.org Raymii.org Logo

Quis custodiet ipsos custodes?
Home | About | All pages | Cluster Status | RSS Feed

Bash Bits: Check if item is in array

Published: 21-09-2013 | Author: Remy van Elst | Text only version of this article


❗ This post is over ten years old. It may no longer be up to date. Opinions may have changed.

Bash Bits are small examples, tips and tutorials for Bash (Scripts). This bash bit shows you how find out if an array has an item.

Recently I removed all Google Ads from this site due to their invasive tracking, as well as Google Analytics. Please, if you found this content useful, consider a small donation using any of the options below:

I'm developing an open source monitoring app called Leaf Node Monitoring, for windows, linux & android. Go check it out!

Consider sponsoring me on Github. It means the world to me if you show your appreciation and you'll help pay the server costs.

You can also sponsor me by getting a Digital Ocean VPS. With this referral link you'll get $100 credit for 60 days.

All Bash Bits can be found using this link

This is a simple function which helps you find out if an (non associative) array has an item. It allows you to call the function with just the array name, not ${arrayname[@]}. It returns 1 if the item is in the array, and 0 if it is not.

This is the function:

in_array() {
    local haystack=${1}[@]
    local needle=${2}
    for i in ${!haystack}; do
        if [[ ${i} == ${needle} ]]; then
            return 0
        fi
    done
    return 1
}

Now we can test it and see that it works:

declare -a vpsservers=("vps1" "vps2" "vps3" "vps4" "vps6");

in_array vpsservers vps3 && echo "found" || echo "not found"
in_array vpsservers vps5 && echo "found" || echo "not found"

Should return:

found
not found

Now a usage example. Lets say you have a script which requires a specific version of Ubuntu and does not work on other versions of ubuntu. You can use this to check if the version of ubuntu is supported with this function.

declare -a supported_ubuntu=("Ubuntu 10.04.1 LTS" "Ubuntu 10.04.3 LTS" "Ubuntu 10.04.4 LTS" "Ubuntu 10.10" "Ubuntu 12.04 LTS" "Ubuntu 12.04.1 LTS")

if [ -f "/etc/lsb-release" ]; then
    running_ubuntu=`awk -F "\"" '/DESCRIPTION/ { print $2 }' /etc/lsb-release`
    if in_array supported_ubuntu "${running_ubuntu}"; then
        echo "${running_ubuntu} is supported."
    else
        echo "${running_ubuntu} is not supported. Run ${0} again with the -f option to ignore this warning."
        exit 1
    fi
fi

Do note that forcing a specific version of something is not a best practice, however sometimes you are forced to.

Tags: array , bash , bash-bits , haystack , needle , shell , snippets