
Есть ли хороший способ проверить, есть ли элемент в массиве в 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