Как сделать вывод для grep неудачным?

Я использую инструкцию if-else для поиска ключевых слов и отображения результатов в терминале, вот пример моего кода.

read finding if ["$finding" != "" ]; then grep $finding information.txt else echo "No such information in database." fi 

Но терминал ничего не отображает, если я использую информацию, которая не существует. Я начал работать около недели назад, возможно, потребуется больше объяснений о том, как работает определенный код.

3 Solutions collect form web for “Как сделать вывод для grep неудачным?”

  • Добавить пробел после [ (это команда)
  • Используйте -n чтобы проверить, является ли длина строки отличной от нуля, или -z чтобы проверить, если она равна нулю
  • Поместите двойные кавычки вокруг переменных

Так:

 read finding if [ -z "$finding" ]; then echo "You didn't enter anything" else grep "$finding" information.txt if [ ! "$?" -eq 0 ]; then echo "No such information in database." fi fi 

Использование некоторых логических операторов (Начиная с @jimmij)

grep -q "$finding" information.txt ведет себя как логический ответ (ничего не печатает, только имеет статус возврата 0, если найден, отличное от нуля).

grep -F -- "$finding" ... текст поиска вместо regexp (удалите его, если вы хотите найти регулярное выражение – могут быть некоторые риски для безопасности … (спасибо @StephanChazelas))

 read finding if [ -z "$finding" ]; then echo "You didn't enter anything" else grep -qF -- "$finding" information.txt && echo "found" || echo "not found" fi 

или даже

 [ -z "$finding" ] && echo "nothing entered" || grep -qF -- "$finding" information.txt || echo "not found" 

(хотя будьте осторожны, он также будет запускать второй grep и / или echo если первое echo выходит из строя)

Изменить 1 > explain grep -q ... Конечно.

В нормальных ситуациях статус возврата grep равен 0 (и просто возвращает «не 0», если возникает ошибка (например, файл не найден))

grep -qF exp file «возвращает» 0, если он находит exp в файле, в противном случае ошибка ( grep -q exp file сделал бы это, если бы выражение regexp было сопоставлено в file ).

Это поведение можно использовать в инструкциях управления bash (if, elif, while, &&, || и т. Д.),

 read f if [ -z "$f" ]; then echo "You didn't enter anything" elif grep -qF -- "$f" information.txt; then echo "found" else echo "not found" fi 
 i=0 until [ "$((i+=1))" -gt 5 ] || { printf '\nPrompt: ' read finding && [ -n "$finding" ] };do printf '\nINVALID:\tTry again.\n' done <>/dev/tty >&0 grep -- "${finding:?INSUFFICIENT INPUT!}" <info.txt || ! printf '%s:\tNot found in database.' "$finding" >&2 

Вы должны тестировать не только то, что $finding не является нулевым, но также и то, что read завершается успешно – и поэтому оно устанавливает его в первую очередь. В приведенном выше цикле будет предложено ввести и попытаться прочитать с терминала строку не нулевого входного ввода 5 раз, прежде чем выйти из w / error.

  • "${expand:?SUBSTITUTE ONLY IF UNSET OR NULL! >STDERR}"
    • Пустое значение для $finding обрабатывается как побочный эффект параметра ${ :? расширение } и приводит к сообщению, записанному в stderr и немедленному выходу из неинтерактивной оболочки.
  • cmd ... <redirected_input_file
    • Синтаксическая ошибка заключается в попытке перенаправить из файла, который не может быть открыт (например, тот, который не существует или для которого у эффективного UID / GID нет разрешений на чтение), и поэтому, если info.txt по какой-либо причине недействителен неинтерактивная оболочка записывает диагностическое сообщение в stderr а также немедленно выходит. Это также справедливо, если попытка read превысит любые ограничения, вызванные ulimit и применяется в равной степени к начальному, until ... done <>in >&out loop.
  • grep ... || ! printf '%s: fmt' "$param"
    • Поскольку любые ошибки ввода-вывода пользователя или файла уже привели к выходу оболочки до grep , единственными двумя возможными результатами вышеупомянутой формы являются то, что grep соответствует шаблону в "$finding" хотя бы один раз и записывает соответствующие строки в stdout или что он не соответствует даже один раз и возвращает значение, отличное от 0. В последнем случае printf записывает информационное сообщение в stderr и возвращает 1.
  • Поймать неожиданный ввод одиночного символа в bash
  • shell scripting - несколько тестов равенства в одном выражении if
  • Как узнать, существует ли каталог?
  • `test` и` [`- разные бинарные файлы, любая разница?
  • Что означает '-size +0' в команде 'test'
  • Как сравнить строки в ksh
  • Модернизирован, чтобы проверить ветвь по ошибке в debian ... как я могу вернуться к стабильной?
  • Множественный оператор, который включает специальные символы, используя при возникновении ошибок
  • Interesting Posts

    Может ли systemd-journald использовать сеть для передачи?

    Командная строка 7z добавляет файл в плоский каталог 7z-файл

    Почему параметры сортировки -c (проверьте, отсортированы) и -o (запись в выходной файл), не совместимы

    Неправильная ассоциация каталогов в аптеках Cinnamon на Debian 8

    Как диагностировать проблему с использованием дампа ядра?

    Tails OS – изменение параметров загрузки

    NOQUEUE: SYSERR (root): opendaemonsocket: daemon MTA: сервер SMTP-разъем клин: выход

    Как вы освобождаете ресурсы в Ubuntu?

    Есть ли способ сканирования локальной сети с включенной dhcp для просмотра IP-адреса подключенных устройств с компьютера GNU / Linux?

    Как сделать принтер с точечной матрицей печатать каждую строку 'tail -f'

    Хорошо ли работает Linux с зашифрованными дисками ntfs?

    Захват содержимого экрана для анализа ошибок

    Общая скорость игры Mplayer / SMPlayer в Ubuntu

    Переформатирование отрицательных чисел с помощью sed или awk

    Как я могу проверить, равны ли два gzipped-файла?

    Linux и Unix - лучшая ОС в мире.