Se i nomi dei file non contengono nuove righe, è possibile evitare più invocazioni grepfacendo stampare a grep i nomi dei file corrispondenti e contare i risultati.
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
Il numero di partite è "${#matches[@]}".
Potrebbe esserci un modo per utilizzare grep --null -lwqui, ma non sono sicuro di come analizzare l'output . Bash var=( array elements )non ha un modo di usare un \0delimitatore invece di \n. Forse l'integrato di Bash mapfilepuò farlo? Ma probabilmente no, perché si specifica il delimitatore con -d string.
Potresti count=$(grep -l | wc -l), ma poi hai due processi esterni, quindi potresti anche solo eseguire grepi due file separatamente. (La differenza tra grepvs. wcoverhead di avvio è piccola rispetto a roba fork + exec + Dynamic Linker per avviare un processo separato).
Inoltre, con wc -lte non scopri quale file corrisponde.
Con i risultati acquisiti in un array, potrebbe essere già quello che vuoi o se esiste esattamente 1 corrispondenza, puoi verificare se è stato il primo input o meno.
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è una scorciatoia per ${matches[0]}, il primo elemento dell'array.