Подтвердить что ты не робот

Zsh: проверить, есть ли строка в массиве

например.

foo=(a b c)

Теперь, как я могу сделать легкую проверку, если b находится в $foo?

4b9b3361

Ответ 1

Вы можете использовать обратную подпитку:

pax$ foo=(a b c)

pax$ if [[ ${foo[(r)b]} == b ]] ; then ; echo yes ; else ; echo no ; fi
yes

pax$ if [[ ${foo[(r)x]} == x ]] ; then ; echo yes ; else ; echo no ; fi
no

В Subscript Flags вы найдете ссылки на man zshparam (по крайней мере, в zsh 4.3.10 в разделе Ubuntu 10.10).


В качестве альтернативы (спасибо geekosaur), вы можете использовать:

pax$ if [[ ${foo[(i)b]} -le ${#foo} ]] ; then ; echo yes ; else ; echo no ; fi

Вы можете видеть, что вы получаете из этих двух выражений, просто делая:

pax$ echo ${foo[(i)a]} ${#foo}
1 3

pax$ echo ${foo[(i)b]} ${#foo}
2 3

pax$ echo ${foo[(i)c]} ${#foo}
3 3

pax$ echo ${foo[(i)d]} ${#foo}
4 3

Ответ 2

(( ${foo[(I)b]} )) \
  && echo "it in" \
  || echo "it somewhere else maybe"

Ответ 3

Обратные индексы всегда будут возвращать что-либо, если совпадение найдено и ничего не вернет, если совпадение не найдено. Мы можем использовать это, чтобы упростить ответ еще больше.

$ foo=(a b c)

$ [[ -n "${foo[(r)b]}" ]] && echo 'b was found.' || echo 'b was not found.'
b was found.

$ [[ -n "${foo[(r)d]}" ]] && echo 'd was found.' || echo 'd was not found.'
d was not found.