Linux read значение по умолчанию

Содержание
  1. Команда read в Bash
  2. Встроенное read Bash
  3. Изменение разделителя
  4. Строка подсказки
  5. Назначьте слова в массив
  6. Выводы
  7. Чтение переменной в bash со значением по умолчанию
  8. 9 ответов
  9. 5 практических примеров команды read в Linux
  10. Что такое команда read в Linux?
  11. Прочитайте примеры команды read
  12. Основные концепции программирования
  13. 1. Команда read без параметров
  14. Подробнее о переменных
  15. 2. Оперативный вариант -p
  16. 3. «Secret» / Тихая опция -s
  17. 4. Использование ограничения символов с опцией -n
  18. 5. Хранение информации в массиве -a
  19. Бонусный совет: добавление функции тайм-аута
  20. Заключение
  21. Bash-скрипты, часть 4: ввод и вывод
  22. Стандартные дескрипторы файлов
  23. STDIN
  24. STDOUT
  25. STDERR
  26. ▍Перенаправление потока ошибок
  27. ▍Перенаправление потоков ошибок и вывода
  28. Перенаправление вывода в скриптах
  29. ▍Временное перенаправление вывода
  30. ▍Постоянное перенаправление вывода
  31. Перенаправление ввода в скриптах
  32. Создание собственного перенаправления вывода
  33. Создание дескрипторов файлов для ввода данных
  34. Закрытие дескрипторов файлов
  35. Получение сведений об открытых дескрипторах
  36. Подавление вывода
  37. Итоги

Команда read в Bash

Bash поставляется с рядом встроенных команд, которые можно использовать в командной строке или в сценариях оболочки.

В этой статье мы рассмотрим встроенную команду read .

Встроенное read Bash

read — это встроенная команда bash, которая считывает строку из стандартного ввода (или из файлового дескриптора) и разбивает строку на слова. Первое слово присваивается первому имени, второе — второму имени и так далее.

Общий синтаксис встроенной функции read имеет следующий вид:

Чтобы проиллюстрировать, как работает команда, откройте терминал, введите read var1 var2 и нажмите «Enter». Команда будет ждать, пока пользователь введет данные. Введите два слова и нажмите «Enter».

Слова присваиваются именам, которые передаются команде read качестве аргументов. Используйте echo или printf чтобы проверить это:

Вместо того, чтобы вводить текст на терминале, вы можете передать стандартный ввод для read с помощью других методов, таких как piping, here-string или heredoc :

Вот пример использования строки здесь и printf :

Если команде read не задан аргумент, вся строка присваивается переменной REPLY :

Если количество аргументов, предоставленных для read , больше, чем количество слов, прочитанных из ввода, оставшиеся слова присваиваются фамилии:

В противном случае, если количество аргументов меньше количества имен, оставшимся именам присваивается пустое значение:

По умолчанию read интерпретирует обратную косую черту как escape-символ, что иногда может вызывать неожиданное поведение. Чтобы отключить экранирование обратной косой черты, вызовите команду с параметром -r .

Ниже приведен пример, показывающий, как работает read при вызове с параметром -r и без него:

Как правило, вы всегда должны использовать read с параметром -r .

Изменение разделителя

По умолчанию при read строка разбивается на слова с использованием одного или нескольких пробелов, табуляции и новой строки в качестве разделителей. Чтобы использовать другой символ в качестве разделителя, присвойте его переменной IFS (внутренний разделитель полей).

Когда IFS установлен на символ, отличный от пробела или табуляции, слова разделяются ровно одним символом:

Строка разделена четырьмя словами. Второе слово — это пустое значение, представляющее отрезок между разделителями. Он создан, потому что мы использовали два символа-разделителя рядом друг с другом ( :: .

Для разделения строки можно использовать несколько разделителей. При указании нескольких разделителей присваивайте символы переменной IFS без пробела между ними.

Вот пример использования _ и — качестве разделителей:

Строка подсказки

При написании интерактивных сценариев bash вы можете использовать команду read для получения пользовательского ввода.

Чтобы указать строку приглашения, используйте параметр -p . Подсказка печатается перед выполнением read и не включает новую строку.

Вот простой пример:

Как правило, вы будете использовать для read команды внутри в while цикл , чтобы заставить пользователя дать один из ожидаемых ответов.

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

Если сценарий оболочки просит пользователей ввести конфиденциальную информацию, например пароль, используйте параметр -s который сообщает read не печатать ввод на терминале:

Назначьте слова в массив

Чтобы присвоить слова массиву вместо имен переменных, вызовите команду read с параметром -a :

Когда даны и массив, и имя переменной, все слова присваиваются массиву.

Выводы

Команда read используется для разделения строки ввода на слова.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Источник

Чтение переменной в bash со значением по умолчанию

Мне нужно прочитать значение из терминала в bash-скрипт. Я хотел бы иметь возможность предоставить значение по умолчанию, которое пользователь может изменить.

в этом скрипте приглашение «пожалуйста, введите свое имя:» значение по умолчанию — «Рикардо», и курсор будет после значения по умолчанию. Есть ли способ сделать это в bash-скрипт?

9 ответов

можно использовать расширения параметр например

это отображает имя после приглашения следующим образом:

с курсором в конце имени и позволяет пользователю редактировать его. Последняя строка является необязательной и заставляет имя быть исходным по умолчанию, если пользователь удаляет ввод или значение по умолчанию (отправка null).

Я нашел этот вопрос, искал способ представить что-то вроде:

используя приведенные выше примеры, я вывел следующее: —

надеюсь, что это поможет кому-то не надо додумывать логику, если они сталкиваются с той же проблемой

Я только что использовал этот шаблон, который я предпочитаю:

установите значение по умолчанию; распечатайте его; прочитайте новое значение; если есть новое значение, используйте его вместо значения по умолчанию. Существует (или было) некоторые вариации между оболочками и системами о том, как подавить новую строку в конце подсказки. Обозначение «\c», похоже, работает на MacOS X 10.6.3 с 3.x bash и работает над большинством вариантов Unix, полученных из системы V, используя оболочки Bourne или Korn.

Также обратите внимание, что пользователь, вероятно, не понимают, что происходит за кулисами; их новые данные будут введены после имени, уже появившегося на экране. Возможно, лучше отформатировать его:

параметр-e и-t не работают вместе. я попробовал некоторые выражения, и результатом стал следующий фрагмент кода:

Читайте также:  Карибский кризис windows 10

Источник

5 практических примеров команды read в Linux

Главное меню » Операционная система Linux » 5 практических примеров команды read в Linux

Что такое команда read в Linux?

Команда read в Linux – это способ взаимодействия пользователей с вводом с клавиатуры, который вы можете увидеть как stdin (стандартный ввод) или другие подобные описания.

Другими словами, если вы хотите, чтобы ваш bash-скрипт принимал ввод от пользователя, вам придется использовать команду read.

Мы собираемся написать несколько простых скриптов bash, чтобы показать вам практическое использование команды read.

Прочитайте примеры команды read

Команда read может сбить с толку, особенно для тех, кто плохо знаком со сценариями оболочки. Сценарии, которые мы собираемся использовать здесь, очень просты для понимания и должны легко следовать, особенно если вы практикуете вместе с учебным пособием.

Основные концепции программирования

Практически для каждой программы или сценария вы хотите получить информацию от пользователя (входные данные) и сообщить компьютеру, что делать с этой информацией (выходные данные).

Когда вы используете read, вы связываетесь с терминалом bash, который хотите захватить ввод от пользователя. По умолчанию команда создаст переменную для сохранения этого ввода.

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

1. Команда read без параметров

Когда вы печатаете read без каких-либо дополнительных опций, вам нужно нажать Enter, чтобы начать захват. Система будет захватывать ввод, пока вы снова не нажмете ввод.

По умолчанию эта информация будет храниться в переменной с именем $REPLY.

Для упрощения работы с первым примером мы будем использовать символ ↵, который будет отображаться при нажатии клавиши ввода.

Подробнее о переменных

Как мы упоминали ранее, переменная $REPLY встроена в read, поэтому вам не нужно объявлять ее.

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

Когда вы хотите вызвать переменную, вы будете использовать $ перед именем. Вот пример, где мы создаем переменную AndreyEx и присваиваем ей значение ввода.

Вы можете использовать команду echo, чтобы убедиться, что команда read сделала свое дело:

2. Оперативный вариант -p

Если вы пишете сценарий и хотите захватить ввод пользователя, существует опция чтения, чтобы создать подсказку, которая может упростить ваш код. Кодирование это все о эффективности, верно?

Вместо использования дополнительных строк и команд эха, вы можете просто использовать флаг -p опции. Текст, который вы вводите в кавычки, будет отображаться так, как задумано, и пользователю не нужно будет нажимать клавишу ввода, чтобы начать ввод данных.

Поэтому вместо того, чтобы писать две строки кода, вот так:

Вы можете использовать опцию -p с командой read следующим образом:

Ввод будет сохранен в переменной $username.

3. «Secret» / Тихая опция -s

Мы написали скрипт Simpe Bash, чтобы продемонстрировать следующий флаг. Сначала взгляните на результат.

Вот содержание, secret.sh, если вы хотите воссоздать его.

Как видите, опция -s маскировала ввод при вводе пароля. Тем не менее, это поверхностный метод и не предлагает реальной безопасности.

4. Использование ограничения символов с опцией -n

Вы можете добавить ограничение к входу и ограничить его количеством символов длиной n.

Давайте использовать тот же скрипт из предыдущего, но изменим его так, чтобы ввод был ограничен 5 символами.

Просто добавьте, -n N где N номер вашего выбора.

Мы сделали то же самое для нашего пароля.

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

Тем не менее, мы все еще могли написать МЕНЬШЕ, чем 5 символов, пока мы нажмем ↵после ввода.

Если вы хотите ограничить это, вы можете использовать -N (вместо -n). Эта модификация делает так, что требуется ровно 5 символов, ни меньше, ни больше.

5. Хранение информации в массиве -a

Вы также можете использовать команду чтения в Linux для создания своих собственных массивов. Это означает, что мы можем назначить порции ввода для элементов в массиве. По умолчанию клавиша пробела будет разделять элементы.

Если вы плохо знакомы с массивами или видите, их в bash впервые, мы опишем:

  • Введите нужные элементы, разделенные пробелами.
  • Если мы поместим только переменную @, она будет повторяться и печатать весь цикл.
  • Символ @ представляет номер элемента, а после двоеточий мы можем указать итерацию от индекса 0 до индекса 3 (как написано здесь).
  • Печатает элемент с индексом 0.
  • Аналогично приведенному выше, но демонстрирует, что элементы разделены пространством

Бонусный совет: добавление функции тайм-аута

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

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

Заключение

Мы надеемся, что эта статья помогло вам начать работу с командой чтения в Linux. Как всегда, мы рады услышать от наших читателей информацию, которая им интересна. Оставьте комментарий ниже и поделитесь с нами своими мыслями!

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

Bash-скрипты, часть 4: ввод и вывод

В прошлый раз, в третьей части этой серии материалов по bash-скриптам, мы говорили о параметрах командной строки и ключах. Наша сегодняшняя тема — ввод, вывод, и всё, что с этим связано.

Вы уже знакомы с двумя методами работы с тем, что выводят сценарии командной строки:

  • Отображение выводимых данных на экране.
  • Перенаправление вывода в файл.
Читайте также:  Grub gfxpayload linux keep

Иногда что-то надо показать на экране, а что-то — записать в файл, поэтому нужно разобраться с тем, как в Linux обрабатывается ввод и вывод, а значит — научиться отправлять результаты работы сценариев туда, куда нужно. Начнём с разговора о стандартных дескрипторах файлов.

Стандартные дескрипторы файлов

Всё в Linux — это файлы, в том числе — ввод и вывод. Операционная система идентифицирует файлы с использованием дескрипторов.

Каждому процессу позволено иметь до девяти открытых дескрипторов файлов. Оболочка bash резервирует первые три дескриптора с идентификаторами 0, 1 и 2. Вот что они означают.

  • 0 , STDIN — стандартный поток ввода.
  • 1 , STDOUT — стандартный поток вывода.
  • 2 , STDERR — стандартный поток ошибок.

Эти три специальных дескриптора обрабатывают ввод и вывод данных в сценарии.
Вам нужно как следует разобраться в стандартных потоках. Их можно сравнить с фундаментом, на котором строится взаимодействие скриптов с внешним миром. Рассмотрим подробности о них.

STDIN

STDIN — это стандартный поток ввода оболочки. Для терминала стандартный ввод — это клавиатура. Когда в сценариях используют символ перенаправления ввода — , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

Многие команды bash принимают ввод из STDIN , если в командной строке не указан файл, из которого надо брать данные. Например, это справедливо для команды cat .

Когда вы вводите команду cat в командной строке, не задавая параметров, она принимает ввод из STDIN . После того, как вы вводите очередную строку, cat просто выводит её на экран.

STDOUT

STDOUT — стандартный поток вывода оболочки. По умолчанию это — экран. Большинство bash-команд выводят данные в STDOUT , что приводит к их появлению в консоли. Данные можно перенаправить в файл, присоединяя их к его содержимому, для этого служит команда >> .

Итак, у нас есть некий файл с данными, к которому мы можем добавить другие данные с помощью этой команды:

То, что выведет pwd , будет добавлено к файлу myfile , при этом уже имеющиеся в нём данные никуда не денутся.

Перенаправление вывода команды в файл

Пока всё хорошо, но что если попытаться выполнить что-то вроде показанного ниже, обратившись к несуществующему файлу xfile , задумывая всё это для того, чтобы в файл myfile попало сообщение об ошибке.

После выполнения этой команды мы увидим сообщения об ошибках на экране.

Попытка обращения к несуществующему файлу

При попытке обращения к несуществующему файлу генерируется ошибка, но оболочка не перенаправила сообщения об ошибках в файл, выведя их на экран. Но мы-то хотели, чтобы сообщения об ошибках попали в файл. Что делать? Ответ прост — воспользоваться третьим стандартным дескриптором.

STDERR

STDERR представляет собой стандартный поток ошибок оболочки. По умолчанию этот дескриптор указывает на то же самое, на что указывает STDOUT , именно поэтому при возникновении ошибки мы видим сообщение на экране.

Итак, предположим, что надо перенаправить сообщения об ошибках, скажем, в лог-файл, или куда-нибудь ещё, вместо того, чтобы выводить их на экран.

▍Перенаправление потока ошибок

Как вы уже знаете, дескриптор файла STDERR — 2. Мы можем перенаправить ошибки, разместив этот дескриптор перед командой перенаправления:

Сообщение об ошибке теперь попадёт в файл myfile .

Перенаправление сообщения об ошибке в файл

▍Перенаправление потоков ошибок и вывода

При написании сценариев командной строки может возникнуть ситуация, когда нужно организовать и перенаправление сообщений об ошибках, и перенаправление стандартного вывода. Для того, чтобы этого добиться, нужно использовать команды перенаправления для соответствующих дескрипторов с указанием файлов, куда должны попадать ошибки и стандартный вывод:

Перенаправление ошибок и стандартного вывода

Оболочка перенаправит то, что команда ls обычно отправляет в STDOUT , в файл correctcontent благодаря конструкции 1> . Сообщения об ошибках, которые попали бы в STDERR , оказываются в файле errorcontent из-за команды перенаправления 2> .

Если надо, и STDERR , и STDOUT можно перенаправить в один и тот же файл, воспользовавшись командой &> :

Перенаправление STDERR и STDOUT в один и тот же файл

После выполнения команды то, что предназначено для STDERR и STDOUT , оказывается в файле content .

Перенаправление вывода в скриптах

Существует два метода перенаправления вывода в сценариях командной строки:

  • Временное перенаправление, или перенаправление вывода одной строки.
  • Постоянное перенаправление, или перенаправление всего вывода в скрипте либо в какой-то его части.

▍Временное перенаправление вывода

В скрипте можно перенаправить вывод отдельной строки в STDERR . Для того, чтобы это сделать, достаточно использовать команду перенаправления, указав дескриптор STDERR , при этом перед номером дескриптора надо поставить символ амперсанда ( & ):

Если запустить скрипт, обе строки попадут на экран, так как, как вы уже знаете, по умолчанию ошибки выводятся туда же, куда и обычные данные.

Запустим скрипт так, чтобы вывод STDERR попадал в файл.

Как видно, теперь обычный вывод делается в консоль, а сообщения об ошибках попадают в файл.

Сообщения об ошибках записываются в файл

▍Постоянное перенаправление вывода

Если в скрипте нужно перенаправлять много выводимых на экран данных, добавлять соответствующую команду к каждому вызову echo неудобно. Вместо этого можно задать перенаправление вывода в определённый дескриптор на время выполнения скрипта, воспользовавшись командой exec :

Перенаправление всего вывода в файл

Если просмотреть файл, указанный в команде перенаправления вывода, окажется, что всё, что выводилось командами echo , попало в этот файл.

Команду exec можно использовать не только в начале скрипта, но и в других местах:

Вот что получится после запуска скрипта и просмотра файлов, в которые мы перенаправляли вывод.

Перенаправление вывода в разные файлы

Сначала команда exec задаёт перенаправление вывода из STDERR в файл myerror . Затем вывод нескольких команд echo отправляется в STDOUT и выводится на экран. После этого команда exec задаёт отправку того, что попадает в STDOUT , в файл myfile , и, наконец, мы пользуемся командой перенаправления в STDERR в команде echo , что приводит к записи соответствующей строки в файл myerror.

Читайте также:  Irbis tw36 не загружается windows

Освоив это, вы сможете перенаправлять вывод туда, куда нужно. Теперь поговорим о перенаправлении ввода.

Перенаправление ввода в скриптах

Для перенаправления ввода можно воспользоваться той же методикой, которую мы применяли для перенаправления вывода. Например, команда exec позволяет сделать источником данных для STDIN какой-нибудь файл:

Эта команда указывает оболочке на то, что источником вводимых данных должен стать файл myfile , а не обычный STDIN . Посмотрим на перенаправление ввода в действии:

Вот что появится на экране после запуска скрипта.

В одном из предыдущих материалов вы узнали о том, как использовать команду read для чтения данных, вводимых пользователем с клавиатуры. Если перенаправить ввод, сделав источником данных файл, то команда read , при попытке прочитать данные из STDIN , будет читать их из файла, а не с клавиатуры.

Некоторые администраторы Linux используют этот подход для чтения и последующей обработки лог-файлов.

Создание собственного перенаправления вывода

Перенаправляя ввод и вывод в сценариях, вы не ограничены тремя стандартными дескрипторами файлов. Как уже говорилось, можно иметь до девяти открытых дескрипторов. Остальные шесть, с номерами от 3 до 8, можно использовать для перенаправления ввода или вывода. Любой из них можно назначить файлу и использовать в коде скрипта.

Назначить дескриптор для вывода данных можно, используя команду exec :

После запуска скрипта часть вывода попадёт на экран, часть — в файл с дескриптором 3 .

Перенаправление вывода, используя собственный дескриптор

Создание дескрипторов файлов для ввода данных

Перенаправить ввод в скрипте можно точно так же, как и вывод. Сохраните STDIN в другом дескрипторе, прежде чем перенаправлять ввод данных.

После окончания чтения файла можно восстановить STDIN и пользоваться им как обычно:

В этом примере дескриптор файла 6 использовался для хранения ссылки на STDIN . Затем было сделано перенаправление ввода, источником данных для STDIN стал файл. После этого входные данные для команды read поступали из перенаправленного STDIN , то есть из файла.

После чтения файла мы возвращаем STDIN в исходное состояние, перенаправляя его в дескриптор 6 . Теперь, для того, чтобы проверить, что всё работает правильно, скрипт задаёт пользователю вопрос, ожидает ввода с клавиатуры и обрабатывает то, что введено.

Закрытие дескрипторов файлов

Оболочка автоматически закрывает дескрипторы файлов после завершения работы скрипта. Однако, в некоторых случаях нужно закрывать дескрипторы вручную, до того, как скрипт закончит работу. Для того, чтобы закрыть дескриптор, его нужно перенаправить в &- . Выглядит это так:

После исполнения скрипта мы получим сообщение об ошибке.

Попытка обращения к закрытому дескриптору файла

Всё дело в том, что мы попытались обратиться к несуществующему дескриптору.

Будьте внимательны, закрывая дескрипторы файлов в сценариях. Если вы отправляли данные в файл, потом закрыли дескриптор, потом — открыли снова, оболочка заменит существующий файл новым. То есть всё то, что было записано в этот файл ранее, будет утеряно.

Получение сведений об открытых дескрипторах

Для того, чтобы получить список всех открытых в Linux дескрипторов, можно воспользоваться командой lsof . Во многих дистрибутивах, вроде Fedora, утилита lsof находится в /usr/sbin . Эта команда весьма полезна, так как она выводит сведения о каждом дескрипторе, открытом в системе. Сюда входит и то, что открыли процессы, выполняемые в фоне, и то, что открыто пользователями, вошедшими в систему.

У этой команды есть множество ключей, рассмотрим самые важные.

  • -p Позволяет указать ID процесса.
  • -d Позволяет указать номер дескриптора, о котором надо получить сведения.

Для того, чтобы узнать PID текущего процесса, можно использовать специальную переменную окружения $$ , в которую оболочка записывает текущий PID .

Ключ -a используется для выполнения операции логического И над результатами, возвращёнными благодаря использованию двух других ключей:

Вывод сведений об открытых дескрипторах

Тип файлов, связанных с STDIN , STDOUT и STDERR — CHR (character mode, символьный режим). Так как все они указывают на терминал, имя файла соответствует имени устройства, назначенного терминалу. Все три стандартных файла доступны и для чтения, и для записи.

Посмотрим на вызов команды lsof из скрипта, в котором открыты, в дополнение к стандартным, другие дескрипторы:

Вот что получится, если этот скрипт запустить.

Просмотр дескрипторов файлов, открытых скриптом

Скрипт открыл два дескриптора для вывода ( 3 и 6 ) и один — для ввода ( 7 ). Тут же показаны и пути к файлам, использованных для настройки дескрипторов.

Подавление вывода

Иногда надо сделать так, чтобы команды в скрипте, который, например, может исполняться как фоновый процесс, ничего не выводили на экран. Для этого можно перенаправить вывод в /dev/null . Это — что-то вроде «чёрной дыры».

Вот, например, как подавить вывод сообщений об ошибках:

Тот же подход используется, если, например, надо очистить файл, не удаляя его:

Итоги

Сегодня вы узнали о том, как в сценариях командной строки работают ввод и вывод. Теперь вы умеете обращаться с дескрипторами файлов, создавать, просматривать и закрывать их, знаете о перенаправлении потоков ввода, вывода и ошибок. Всё это очень важно в деле разработки bash-скриптов.

В следующий раз поговорим о сигналах Linux, о том, как обрабатывать их в сценариях, о запуске заданий по расписанию и о фоновых задачах.

Уважаемые читатели! В этом материале даны основы работы с потоками ввода, вывода и ошибок. Уверены, среди вас есть профессионалы, которые могут рассказать обо всём этом то, что приходит лишь с опытом. Если так — передаём слово вам.

Источник

Оцените статью