Если ваши имена файлов не содержат символов новой строки, вы можете избежать нескольких вызовов grep, если grep напечатает имена подходящих файлов и посчитает результаты.
local IFS=$'\n' # inside a function. Otherwise use some other way to save/restore IFS
matches=( $(grep -lw "$users" "$file1" "$file2") )
Количество матчей "${#matches[@]}".
Может быть, есть способ использовать grep --null -lwздесь, но я не уверен, как проанализировать вывод . У Bash var=( array elements )нет способа использовать \0разделитель вместо \n. Может быть, mapfileвстроенный Bash может сделать это? Но, вероятно, нет, потому что вы указываете разделитель с -d string.
Вы могли бы count=$(grep -l | wc -l), но тогда у вас есть два внешних процесса, так что вы могли бы просто запустить grepдва файла по отдельности. (Разница между grepпротив wcнакладных расходов запуска мала по сравнению с вилочным + + Exec динамический компоновщик материал , чтобы запустить отдельный процесс вообще).
Кроме того, с wc -lвами не узнать, какой файл соответствует.
С результатами, захваченными в массиве, это, возможно, уже то, что вы хотите, или если есть ровно 1 совпадение, вы можете проверить, был ли это первый ввод или нет.
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является сокращением для ${matches[0]}первого элемента массива.