Você pode ver se uma entrada está presente canalizando o conteúdo da matriz para grep.
printf "%s\n" "${mydata[@]}" | grep "^${val}$"
Você também pode obter o índice de uma entrada com grep -n, que retorna o número da linha de uma correspondência (lembre-se de subtrair 1 para obter um índice baseado em zero)
Isso será razoavelmente rápido, exceto para matrizes muito grandes.
# given the following data
mydata=(a b c "hello world")
for val in a c hello "hello world"
do
# get line # of 1st matching entry
ix=$( printf "%s\n" "${mydata[@]}" | grep -n -m 1 "^${val}$" | cut -d ":" -f1 )
if [[ -z $ix ]]
then
echo $val missing
else
# subtract 1. Bash arrays are zero-based, but grep -n returns 1 for 1st line, not 0
echo $val found at $(( ix-1 ))
fi
done
a found at 0
c found at 2
hello missing
hello world found at 3
explicação:
-
$( ... )
é o mesmo que usar backticks para capturar a saída de um comando em uma variável
-
printf
gera mydata um elemento por linha
- (todas as citações necessárias, juntamente com
@
em vez de *.
, evitam dividir "hello world" em duas linhas)
-
grep
procura por uma string exata: ^
e $
correspondem ao início e ao fim da linha
-
grep -n
retorna linha #, em forma de 4: hello world
-
grep -m 1
encontra apenas a primeira correspondência
-
cut
extrai apenas o número da linha
- subtrai 1 do número da linha retornada.
Você pode, naturalmente, dobrar a subtração no comando. Mas, em seguida, teste para -1 por falta:
ix=$(( $( printf "%s\n" "${mydata[@]}" | grep -n -m 1 "^${val}$" | cut -d ":" -f1 ) - 1 ))
if [[ $ix == -1 ]]; then echo missing; else ... fi
-
$(( ... ))
faz aritmética inteira