Проверить, находится ли элемент в массиве в bash

Проверить, находится ли элемент в массиве в bash

Есть ли хороший способ проверить, есть ли элемент в массиве в bash (лучше, чем перебирать элементы в цикле)?

Или есть ли другой способ проверить, равно ли число или строка какой-либо из предопределенных констант?

решение1

В Bash 4 вы можете использовать ассоциативные массивы:

# set up array of constants
declare -A array
for constant in foo bar baz
do
    array[$constant]=1
done

# test for existence
test1="bar"
test2="xyzzy"

if [[ ${array[$test1]} ]]; then echo "Exists"; fi    # Exists
if [[ ${array[$test2]} ]]; then echo "Exists"; fi    # doesn't

Для первоначальной настройки массива вы также можете выполнить прямые назначения:

array[foo]=1
array[bar]=1
# etc.

или так:

array=([foo]=1 [bar]=1 [baz]=1)

решение2

Это старый вопрос, но я думаю, что простейшего решения еще не появилось: test ${array[key]+_}. Пример:

declare -A xs=([a]=1 [b]="")
test ${xs[a]+_} && echo "a is set"
test ${xs[b]+_} && echo "b is set"
test ${xs[c]+_} && echo "c is set"

Выходы:

a is set
b is set

Чтобы увидеть, как это работает, проверьтеэтот.

решение3

Существует способ проверить, существует ли элемент ассоциативного массива (не задан), это отличается от пустого:

isNotSet() {
    if [[ ! ${!1} && ${!1-_} ]]
    then
        return 1
    fi
}

Тогда используйте это:

declare -A assoc
KEY="key"
isNotSet assoc[${KEY}]
if [ $? -ne 0 ]
then
  echo "${KEY} is not set."
fi

решение4

#!/bin/bash
function in_array {
  ARRAY=$2
  for e in ${ARRAY[*]}
  do
    if [[ "$e" == "$1" ]]
    then
      return 0
    fi
  done
  return 1
}

my_array=(Drupal Wordpress Joomla)
if in_array "Drupal" "${my_array[*]}"
  then
    echo "Found"
  else
    echo "Not found"
fi

Связанный контент