Рейтинг:2

Сценарий Bash: команда «чтение» не отвечает

флаг in

Я пишу bash-скрипт, который будет

  1. Скачать html код сайта в файл index.html
  2. Спросите пользователя о типе файла и найдите «index.html» для количества совпадающих типов файлов.

Это функция, которая завершит шаг 2:

1. функция findFiles() {
2. echo "Введите тип файла для поиска (включая '.') || Введите EXIT для завершения программы "
3. читать тип файла
4.
5. в то время как [[ "$fileType" != "EXIT" ]];
6. делать
7. если [[ $(grep -q $fileType index.html) = 1 ]]; тогда
8. grep -F "$fileType" index.html >> foundFiles.txt
9. фи
10. готово
11.
12. РМ index.html
13. };

При выполнении строка 3 запрашивает пользовательский ввод, но не отвечает, когда я нажимаю ввод, пример следующий:

2021-09-26 12:41:06 (2,66 МБ/с) — «index.html» сохранен [94126]

Введите тип файла для поиска (включая '.') || Введите EXIT, чтобы завершить программу 
.pdf
.текст



фу
АААА

Я попытался объявить локальную переменную $fileType во-первых, используя читать -p и поставить точку с запятой в конце строки 3. Результат всегда один и тот же, и я не смог найти решение. Я знаю, что то, что следует за строкой 3, ошибочно, но мне просто нужна помощь только со строкой 3, поскольку следующие строки — это то, над чем я хотел бы поработать, чтобы узнать больше о сценариях bash.

Любые идеи приветствуются.

muru avatar
флаг us
Покажите нам, как вы выполняете эту функцию.
Рейтинг:4
флаг cn

Он не должен реагировать. Он делает именно то, что должен: считывает ввод и присваивает его переменной тип файла. Тем не менее, у вас есть пока цикл, который проверяет значение переменной, которая никогда не изменяется:

в то время как [[ "$fileType" != "ВЫХОД" ]];

Поскольку значение $fileType устанавливается только один раз и перед пока петля, что пока становится бесконечным циклом, если вы не передадите ВЫХОД с первой попытки. В любом случае ваш скрипт все равно не будет работать, так как вывод файл шаблона grep -q не будет никогда 1. На самом деле он всегда будет пустым, так как вот что grep -q делает. Я подозреваю, что вы хотели проверить статус выхода команды, но даже это бессмысленно: нет смысла читать весь файл один раз с помощью grep -q только для того, чтобы потом перечитать все это снова с грэп -F.

Вот рабочая версия вашей функции:

функция найтиФайлы() {
  в то время как [[ "$fileType" != "ВЫХОД" ]];
  делать
    echo "Введите тип файла для поиска (включая '.') || Введите EXIT для завершения программы "
    читать тип файла
    grep -F "$fileType" index.html >> foundFiles.txt
  сделано
     РМ index.html
 };

Или, если вы хотите избежать создания пустого найденные файлы.txt если совпадений не найдено, вы можете попробовать:

функция найтиФайлы() {
  в то время как [[ "$fileType" != "ВЫХОД" ]];
  делать
    echo "Введите тип файла для поиска (включая '.') || Введите EXIT для завершения программы "
    читать тип файла
    если grep -qm1 "$fileType" index.html; тогда
      grep -F "$fileType" index.html >> foundFiles.txt
    фи
  сделано
     РМ index.html
 };

обеспечивает grep завершается после первого совпадения, поэтому вам не нужно дважды читать весь файл. Обратите внимание, что я не использую подстановку команд ($(команда)), так как я проверяю успешность выполнения команды и не пытаюсь использовать ее вывод.

Bubbles avatar
флаг in
Да! Спасибо, это решило мою проблему, и я понимаю ваше решение, которое мне очень помогает. Я буду работать над сценарием, чтобы убедиться, что он делает именно то, что я пытаюсь заставить его делать.
Рейтинг:1
флаг cn

Кажется, вы попали в бесконечную петлю. Если пользователь не набрал «ВЫХОД», то пока цикл будет продолжаться вечно. Любой дополнительный текст, который вы вводите, просто отображается на терминале.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.