В операторе массива в bash - PullRequest
11 голосов
/ 02 мая 2011

Есть ли способ проверить, содержит ли массив указанный элемент?

Например, что-то вроде:

array=(one two three)

if [ "one" in ${array} ]; then
...
fi

Ответы [ 7 ]

22 голосов
/ 02 мая 2011

Цикл for сделает свое дело.

array=(one two three)

for i in "${array[@]}"; do
  if [[ "$i" = "one" ]]; then
    ...
    break
  fi
done
7 голосов
/ 02 мая 2011

Попробуйте это:

array=(one two three)
if [[ "${array[*]}" =~ "one" ]]; then
  echo "'one' is found"
fi
5 голосов
/ 02 мая 2011

Я получил функцию «содержит» в моем .bashrc-файле:

contains () 
{ 
    param=$1;
    shift;
    for elem in "$@";
    do
        [[ "$param" = "$elem" ]] && return 0;
    done;
    return 1
}

Хорошо работает с массивом:

contains on $array && echo hit || echo miss
  miss
contains one $array && echo hit || echo miss
  hit
contains onex $array && echo hit || echo miss
  miss

Но не нужен массив:

contains one four two one zero && echo hit || echo miss
  hit
1 голос
/ 02 мая 2011

Мне нравится использовать grep для этого:

if echo ${array[@]} | grep -qw one; then
  # "one" is in the array
  ...
fi

(Обратите внимание, что -q и -w являются нестандартными параметрами для grep: -w говорит, что он работает только с целыми словами, а -q ("quiet") подавляет весь вывод.)

0 голосов
/ 05 марта 2017
In_array() {
    local NEEDLE="$1"
    local ELEMENT

    shift

    for ELEMENT; do
        if [ "$ELEMENT" == "$NEEDLE" ]; then
            return 0
        fi
    done

    return 1
}

declare -a ARRAY=( "elem1" "elem2" "elem3" )
if In_array "elem1" "${ARRAY[@]}"; then
...

Хорошая и элегантная версия выше.

0 голосов
/ 02 мая 2011

, если вы просто хотите проверить, находится ли элемент в массиве, другой подход

case "${array[@]/one/}" in 
 "${array[@]}" ) echo "not in there";;
 *) echo "found ";;
esac
0 голосов
/ 02 мая 2011
array="one two three"
if [ $(echo "$array" | grep one | wc -l) -gt 0 ] ; 
  then echo yes; 
fi

Если это уродливо, вы можете скрыть это в функции.

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