Проверьте, содержит ли массив Bash значение - PullRequest
353 голосов
/ 10 сентября 2010

В Bash, какой самый простой способ проверить, содержит ли массив определенное значение?

Редактировать : С помощью ответов и комментариев после некоторого тестирования я придумал следующее:

function contains() {
    local n=$#
    local value=${!n}
    for ((i=1;i < $#;i++)) {
        if [ "${!i}" == "${value}" ]; then
            echo "y"
            return 0
        fi
    }
    echo "n"
    return 1
}

A=("one" "two" "three four")
if [ $(contains "${A[@]}" "one") == "y" ]; then
    echo "contains one"
fi
if [ $(contains "${A[@]}" "three") == "y" ]; then
    echo "contains three"
fi

Не уверен,лучшее решение, но, похоже, работает.

Ответы [ 32 ]

0 голосов
/ 11 февраля 2016

В продолжение приведенного выше ответа Шона ДиСанти, я думаю, что следующее - это простое и элегантное решение, которое позволяет избежать циклического перебора массива и не дает ложных срабатываний из-за частичных совпадений

function is_in_array {
    local ELEMENT="${1}"
    local DELIM=","
    printf "${DELIM}%s${DELIM}" "${@:2}" | grep -q "${DELIM}${ELEMENT}${DELIM}"
}

Что можно назвать так:

$ haystack=("needle1" "needle2" "aneedle" "spaced needle")
$ is_in_array "needle" "${haystack[@]}"
$ echo $?
1
$ is_in_array "needle1" "${haystack[@]}"
$ echo $?
0
0 голосов
/ 09 января 2013

Следующий код проверяет, находится ли данное значение в массиве, и возвращает его смещение, начинающееся с нуля:

A=("one" "two" "three four")
VALUE="two"

if [[ "$(declare -p A)" =~ '['([0-9]+)']="'$VALUE'"' ]];then
  echo "Found $VALUE at offset ${BASH_REMATCH[1]}"
else
  echo "Couldn't find $VALUE"
fi

Сопоставление выполняется для полных значений, поэтому настройка VALUE = "three" не будет соответствовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...