Se os nomes dos seus arquivos não contiverem novas linhas, você poderá evitar várias invocações de grep fazendo com que o grep imprima os nomes dos arquivos correspondentes e conte os resultados.
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
O número de correspondências é "${#matches[@]}" .
Pode haver uma maneira de usar grep --null -lw aqui, mas não sei como analisar a saída . Bash var=( array elements ) não tem como usar um delimitador \n em vez de mapfile . Talvez bash -d string builtin pode fazer isso? Mas provavelmente não, porque você especifica o delimitador com count=$(grep -l | wc -l) .
Você pode usar grep , mas você tem dois processos externos, portanto, pode executar apenas grep nos dois arquivos separadamente. (A diferença entre wc vs. wc -l de sobrecarga de inicialização é pequena em comparação com o fork + exec + material de vinculador dinâmico para iniciar um processo separado).
Além disso, com $matches você não encontra o qual arquivo correspondente.
Com os resultados capturados em uma matriz, que já pode ser o que você quer, ou se houver exatamente 1 correspondência, você pode verificar se foi a primeira entrada ou não.
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
# print the matching filenames
[[ -n $matches ]] && printf 'match in %s\n' "${matches[@]}"
# figure out which input position the name came from, if there's exactly 1.
if [[ "${#matches[@]" -eq 1 ]]; then
if [[ $matches == "$file1" ]];then
echo "match in file1"
else
echo "match in file2"
fi
fi
${matches[0]} é a abreviação de %code% , o primeiro elemento da matriz.