Se você tiver uma matriz $my_array e quiser saber se ela contém a string foo , o teste é
[[ ${my_array[(ie)foo]} -le ${#my_array} ]]
O valor exato e completo do elemento da matriz deve ser foo ; não é uma verificação de substring ou algo assim.
Se você quiser ver se o valor da variável $my_string está na matriz, use
[[ ${my_array[(ie)$my_string]} -le ${#my_array} ]]
Esta sintaxe (ie) não é muito óbvia. É explicado na seção Subscript Flags do manual do ZSH. A parte i significa que estamos usando “subscrição inversa”: em vez de passar um índice e obter um valor, como fazemos com o usual ${my_array[1]} , estamos passando um valor e pedindo o primeiro subscrito que seria dê esse valor. Este subscrito é numérico e baseado em 1 (o primeiro elemento da matriz está no índice 1), que é diferente da convenção usada pela maioria das linguagens de programação. O e em (ie) significa que queremos uma correspondência exata, sem expandir os caracteres de correspondência de padrão, como * .
Se o valor não for encontrado na matriz, ${my_array[(ie)foo] será avaliado para o primeiro índice após o final da matriz, portanto, para uma matriz de 3 elementos, ele retornará 4. ${#my_array} fornece o índice do último elemento da matriz, portanto, se o primeiro for menor ou igual a último, o valor fornecido estará presente na matriz em algum lugar. Se você quiser verificar se um dado valor é não na matriz, altere o valor "menor que ou igual a" para "maior que":
[[ ${my_array[(ie)foo]} -gt ${#my_array} ]]