Suponha que eu tenha um array não associativo que foi definido como
my_array=(foo bar baz)
Como posso verificar se o array contém uma determinada string? Prefiro uma solução que possa ser usada dentro da condicional de um if
bloco (por exemplo if contains $my_array "something"; then ...
).
$array[(I)foo]
retorna o índice da última ocorrência defoo
in$array
e 0 se não for encontrado. Oe
sinalizador é para que seja umae
correspondência exata em vez de uma correspondência de padrão.Para verificar
$value
se está em uma lista literal de valores, você pode passar essa lista de valores para uma função anônima e procurar o$value
in$@
no corpo da função:Para saber quantas vezes o valor é encontrado no array, você pode usar o
${A:*B}
operador (elementos do arrayA
que também estão no arrayB
):Ou usando correspondência de padrões nos elementos da matriz:
Se você tem um array
$my_array
e quer saber se ele contém a stringfoo
, um teste possível éO valor completo e exato 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, useEssa
(ie)
sintaxe não é muito óbvia. É explicado na seção Subscript Flags do manual do ZSH. Ai
parte significa que estamos usando “subscrito reverso”: ao invés de passar um subscrito e obter um valor, como fazemos com o usual${my_array[1]}
, estamos passando um valor e pedindo o primeiro subscrito que daria esse valor. Esse subscrito é numérico e baseado em 1 (o primeiro elemento da matriz está no índice 1), o que é diferente da convenção usada pela maioria das linguagens de programação. Oe
in(ie)
significa que queremos uma correspondência exata, sem expandir caracteres de correspondência de padrão como*
.Se o valor não for encontrado na matriz,
${my_array[(ie)foo]
será avaliado como o primeiro índice após o final da matriz, portanto, para uma matriz de 3 elementos, retornará 4.${#my_array}
fornece o índice do último elemento da matriz; portanto, se o primeiro é menor ou igual ao último, então o valor fornecido está presente na matriz em algum lugar. Se você quiser verificar se um determinado valor não está na matriz, altere o “menor que ou igual a” para “maior que”: