Se os seus nomes de arquivos não contiverem novas linhas, você poderá evitar várias chamadas grepfazendo com que 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 -lwaqui, mas não sei como analisar a saída . O Bash var=( array elements )não tem como usar um \0delimitador em vez de \n. Talvez o mapfilebuiltin do bash possa fazer isso? Mas provavelmente não, porque você especifica o delimitador com -d string.
Você poderia count=$(grep -l | wc -l), mas então você tem dois processos externos, para que você possa executar apenas grepnos dois arquivos separadamente. (A diferença entre a sobrecarga grepversus a wcinicialização é pequena em comparação com o material fork + exec + linker dinâmico para iniciar um processo separado).
Além disso, wc -lvocê não descobre qual arquivo corresponde.
Com os resultados capturados em uma matriz, isso já pode ser o que você deseja ou, se houver exatamente 1 correspondência, é possível 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é uma abreviação de ${matches[0]}, o primeiro elemento da matriz.