read -r -p 'Enter pattern: ' pattern
result=$( grep -e "$pattern" records )
if [ -n "$result" ]; then
printf '%s\n' "$result"
else
printf 'No match found for pattern "%s"\n' "$pattern"
fi
Присвоениеsearch
(result
в моем коде )лучше всего выполнять вне оператора if
.
Проверка с помощью-n
("эта строка не -пуста?" )о результате.
Не заключайте переменную (в одиночные -кавычки, это не позволит оболочке расширять ее значение ). Вместо этого двойная цитата.
Обратите внимание на «шаблон», а не на «ключевое слово». То, как вы используете grep
здесь, будет использовать предоставленную пользователем -строку как регулярное выражение (шаблон, такой как cat.*dog
), не обязательно как простую фиксированную строку.
cat
следует использовать для объединения файлов, в большинстве других случаев это более или менее бесполезно.
Используйте read -r
, чтобы разрешить пользователю вводить обратную косую черту.
В качестве альтернативы:
read -r -p 'Enter pattern: ' pattern
if ! grep -e "$pattern" records; then
printf 'No match found for pattern "%s"\n' "$pattern"
fi
Это позволяет избежать хранения потенциально огромного количества данных в переменной оболочки и вместо этого полагаться на статус выхода grep
, чтобы определить, может ли шаблон быть найден в файле или нет. Если шаблон найден, будут напечатаны совпадающие строки (и больше ничего делать не нужно ).
Относительно использования printf
вместоecho
:Почему printf лучше, чем echo?
Более короткий, с использованием короткой -цепи ИЛИ.
read -r -p 'Enter pattern: '
grep -e "$REPLY" records ||
printf 'No match found for pattern "%s"\n' "$REPLY"
Вы можете просто перенаправить вывод в файл и $(date...)
как часть имени файла.
напр.:
/path/to/backup_script.sh > /path/to/log/backup_$(date +%F).log
или то же самое в скрипте:
rsync -av... > /path/to/log/backup_$(date +%F).log