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} ]]