Si sus nombres de archivo no contienen nuevas líneas, puede evitar múltiples invocaciones grephaciendo que grep imprima los nombres de los archivos coincidentes y cuente los resultados.
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
El número de partidos es "${#matches[@]}".
Puede haber una forma de usar grep --null -lwaquí, pero no estoy seguro de cómo analizar la salida . Bash var=( array elements )no tiene una forma de usar un \0delimitador en lugar de \n. Tal vez bashtin mapfileincorporado puede hacerlo? Pero probablemente no, porque especificas el delimitador con -d string.
Podría count=$(grep -l | wc -l), pero luego tiene dos procesos externos, por lo que podría ejecutar greplos dos archivos por separado. (La diferencia entre la sobrecarga de inicio grepy la de wcinicio es pequeña en comparación con las cosas fork + exec + dynamic linker para iniciar un proceso por separado).
Además, con wc -lusted no descubre qué archivo coincide.
Con los resultados capturados en una matriz, eso podría ser lo que desea, o si hay exactamente 1 coincidencia, puede verificar si fue la primera entrada o no.
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
$matcheses la abreviatura de ${matches[0]}, el primer elemento de matriz.