Команда чтения Bash

Bash Read Command



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

Что читается?

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







Bash читать справку по встроенной команде

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



Командная строка



помощь читать

Выход





читать:читать [-ерс] [-массив] [-d поделиться] [-i текст] [-n nchars] [-N nchars]
[-p подсказка] [-t тайм-аут] [-u fd] [имя ...]

Прочтите строку из стандартного ввода ирасколотьэто в поля.

Читает одну строку из стандартного ввода или изфайлдескриптор FD
еслито-uопция поставляется. Линиярасколотьв поляв качествесо словом
разделение, и первое слово присваивается первому ИМЕНИ, второе
слово для второго ИМЯ и т. д., с любыми оставшимися словами, назначенными
топоследнийИМЯ. Только найденные персонажив $ IFSпризнаныв качествеслово
разделители.

Если ИМЕНИ не указаны, строкачитатьхранитсявпеременная REPLY.

Параметры:
массив присвоить словачитатьв последовательные индексы массива
переменная ARRAY, начиная с нуля
-ddelimПродолжить допервый символ DELIM -читать, скорее
чем новая строка
-e использовать Readline для получения строкивинтерактивная оболочка
текст использовать ТЕКСТв качествеисходный текстдляReadline
-nнчарсвозвращениепосле чтения символов NCHARS, а не ожидания
дляперевод строки, но с учетом разделителяеслименьше чем

Символы NCHARSчитатьперед разделителем
-Nнчарсвозвращениетолько после прочтения ровно NCHARS символов, если только
EOF встречается иличитать развне, игнорируя любые
разделитель
-пвывести строку PROMPT без символа новой строки перед
пытаясьчитать
делатьне разрешать обратную косую черту для экранирования любых символов
-sделатьнетвыбросилввод, поступающий с терминала
-tтайм-аутвремяиз ивозвращениеотказесликполныйлиния
ввод нечитатьв течение TIMEOUT секунд. Ценность
Переменная TMOUT - это тайм-аут по умолчанию. ТАЙМАУТ может быть
дробное число. Если TIMEOUT0,читатьвозвращается
немедленно, не пытаясьчитатьлюбые данные, возвращающие
только успехесливвод доступен на указанном
файлдескриптор. Ввыходстатус больше чем128
есливремя ожидания превышено
-ufdчитатьизфайлдескриптор FD вместо стандартного ввода

Статус выхода:
Ввозвращениекод равен нулю, если не встречается конец файла,читать разиз
(в который кейсЭтобольше 128), ошибка присвоения переменной

Захват пользовательского ввода

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

Поймать строку ввода

Чтобы поймать строку ввода ИМЕНИ и параметры не требуются при чтении. Если NAME не указано, переменная с именем REPLY используется для хранения пользовательского ввода.



Команды

{
выбросил -n 'Введите что-нибудь и нажмите ввод:';
читать;
выбросилВы набрали$ {REPLY}
}

Выход

Введите что-нибудь и нажмите ввод: что-то(новая линия)
Вы что-то напечатали

Уловить вводное слово

Чтобы поймать слово ввода, требуется опция -d. В случае слова мы бы установили -d на пробел, читаем '-d'. То есть, когда пользователь нажимает пробел, чтение загрузит ОТВЕТ со словом.

Обратите внимание, что когда установлена ​​опция -d, возврат не работает должным образом. Чтобы вернуться на место при попытке поймать слово ввода, можно использовать параметр -e, читаем -e ‘-d‘.

Команды

{
выбросил -n 'Введите что-нибудь и нажмите пробел:';
читать '-d';
выбросил '';
выбросил 'Вы набрали$ {REPLY}'
}

Выход

Введите что-нибудь и нажмите пробел: что-то(Космос)
Вы что-то напечатали

Подскажите пользователю

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

Подскажите пользователю слово

При перехвате входного слова мы использовали echo для записи Type something и нажимали пробел: для стандартного вывода перед чтением ‘-d‘. Параметр -p позволяет отображать сообщение перед чтением со стандартного ввода.

Команды

{
читать -п 'Введите что-нибудь и нажмите пробел:' '-d';
выбросил '';
выбросил 'Вы набрали$ {REPLY}'
}

Выход

Введите что-нибудь и нажмите пробел: что-то(Космос)
Вы что-то напечатали

Запрашивать у пользователя секрет

При перехвате пользовательского ввода без его отображения в терминале пригодится опция -s. read -s -p позволяет вам уловить и скрыть ввод пользователя следующим образом.

Команды

{
читать -s -п «Напишите что-нибудь, я обещаю сохранить это в секрете»:
выбросил '';
выбросил «Ваш секрет в безопасности со мной»;сброшенОТВЕТИТЬ ;
выбросил '$ {REPLY}'
}

Выход

Напишите что-нибудь, что я обещаю сохранить в секрете:
Ваш секрет в безопасности со мной

Функции, использующие чтение

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

Основная концепция

Функции, использующие чтение, используют стандартный ввод и параметры по конвейеру. Основной ввод, который должен быть обработан, например строки в файле, передаются через стандартный ввод через конвейер. Другой входной параметр if-any и option передаются как параметры.

читать -t 1ИМЯ1 ИМЯ2 ...

читатьэтовстроенный команда

-t 1 не позволяет сценарию bash бесконечно ждать возврата строки через стандартный ввод. Если стандартный ввод изначально пуст, функция возвращается с кодом выхода 142, означающим, что дата не была прочитана в течение установленного периода тайм-аута.

NAME1 NAME2 - имена переменных

... может быть указано много имен переменных

Теперь, когда все готово, давайте посмотрим, как выглядят знакомые функции, реализованные с помощью read.

Функция соединения с использованием чтения

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

Сценарий

#! / bin / bash
## присоединиться
## версия 0.0.2 - исправлены параметры рекурсии
########################################################################### #
присоединиться() { { местныйограничитель;ограничительзнак равно'$ {1-}';местныйoutdelimiter;
ограничительзнак равно'$ {2-.}';}
местныйавтомобиль
местныйcdr
местныйIFS
IFSзнак равно'$ {indelimiter}'
читать -t 1автомобиль cdr|| возвращение
тестовое задание '$ {cdr}' || { выбросил '$ {car}';возвращение;}
выбросил '$ {car}$ {outdelimiter}$ {cdr}' | $ {FUNCNAME} '$ {indelimiter}'
'$ {outdelimiter}'
}
########################################################################### #
## сгенерировано create-stub2.sh v0.1.2
## в пн, 17 июн 2019 12:24:59 +0900
## видеть
########################################################################### #

Источник: join.sh
Командная строка

выбросила б| присоединиться

Выход

а.б

Командная строка

выбросила б| присоединиться | присоединиться. |

Выход

к|б

Функции карты с использованием чтения

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

Сценарий

#! / bin / bash
## карта
## версия 0.0.1 - начальная
########################################################################### #
карта() { { местныйимя_функции;имя_функциизнак равно'$ {1}';}
местныйавтомобиль
местныйcdr
местныйIFS
IFSзнак равно'$ {indelimiter-}'
читать -t 1автомобиль cdr|| возвращение
тестовое задание '$ (объявить -f $ {имя_функции})' || возвращение
тестовое задание '$ {car}' || { правда;возвращение;}
$ {function_name} $ {car}
выбросил '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
########################################################################### #
## сгенерировано create-stub2.sh v0.1.2
## вт, 18 июн 2019 08:33:49 +0900
## видеть
########################################################################### #

Источник: map.sh
Команды

NS() { местный язнак равно$ {1};выбросил$((я** 2 ));}
выбросил {1..10} |карта pow

Выход

1
4
9
16
25
36
49
64
81 год
100

Функция фильтрации с использованием чтения

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

Сценарий

#! / bin / bash
## фильтр
## версия 0.0.1 - начальная
########################################################################### #
фильтр() { { местныйимя_функции;имя_функциизнак равно'$ {1}';}
местныйавтомобиль
местныйcdr
местныйIFS
IFSзнак равно'$ {indelimiter-}'
читать -t 1автомобиль cdr|| возвращение
тестовое задание '$ (объявить -f $ {имя_функции})' || возвращение
тестовое задание '$ {car}' || { правда;возвращение;}
$ {function_name} '$ {car}' || выбросил -n '$ {car}'
выбросил '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
########################################################################### #
## сгенерировано create-stub2.sh v0.1.2
## вт, 18 июн 2019 13:19:54 +0900
## видеть
########################################################################### #

Источник: filter.sh

Команды

странный() { местный язнак равно$ {1};тестовое задание !$((я% 2 )) -экв 1;}
выбросил {1..10} |фильтр нечетный

Выход

1 3 5 7 9

Циклы с использованием чтения

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

Базовый цикл при чтении для левой стороны (lhs)

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

Построить

lhs| в то время как читать
делать
правда
сделано
lhs этокомандакоторый возвращает список строк

Команды

seq 5 | в то время как читатья
делать
выбросил $ {i}
сделано

Выход

1
2
3
4
5

Базовый цикл при чтении для правой стороны (правая сторона)

У нас есть файл (rhs) со строками, которые можно прокручивать, используя цикл чтения и while.

Построить

в то время как читать
делать
правда
сделано <rhs

rhs - этофайлсодержащие строки

Команды

seq 5 >rhs
в то время как читатья
делать
выбросил $ {i}
сделано <rhs

Выход

1
2
3
4
5

Пользовательский цикл lhs при использовании чтения

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

Построить

(
IFSзнак равно''
lhs| в то время как читать
делать
правда
сделано
)

lhs - это список слов

Команды

(
IFSзнак равно''
выбросил {1..5} | в то время как читатья
делать
выбросил '$ {i}
сделано
)

Выход

1 2 3 4 5

Чтение из любого fd вместо стандартного ввода

Встроенная опция чтения, часто остающаяся нетронутой, - это та, которая позволяет вам указать, из какого файлового дескриптора читать, прочтите -u FD. По умолчанию FD принимается за стандартный ввод.

Основная концепция

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

_()
{
Кот /разработчик/нулевой>myfifo;# пусто myfifo
exec 3<myfifo;# открыть файл myfifo как fd 3
выбросил 'Привет, мир! - с фд 3 ' >myfifo;# напишите в myfifo
читать -u 3;# читать строку из fd 3
exec 3> &-;# закрыть fd 3
выбросил $ {REPLY} # строка вывода читается из fd 3 перед закрытием
}
_# Привет, мир! с fd 3

Сборка поезда с файловыми дескрипторами и чтение -u FD

Ради интереса я решил собрать шлейф с файловыми дескрипторами и прочитать -u FD. Каждому дескриптору файла пишется номер. Каждый файловый дескриптор считывает из файлового дескриптора 1 ниже и присоединяется к себе.

Командная строка

трепатьlinuxhint.com/строить/test-read-fd.sh поезд10

Выход

инициализация fds ...
инициализация fd3...
fd3инициализированный
инициализация fd4...
fd4инициализированный
fds инициализирован
чтение из fd3а также4...
4 3
fds перед очисткой
0 1 2 3 4 5
убираться ...
очистка файлов ...
сделаноочистка файловых систем
fds после очистки
0 1 2 3

Пропустить функцию с помощью read -u FD

Если вы бежите

безымянный
MINGW64_NT-10.0DESKTOP-XVVVVVV 2.7.0(0,307/5/3)
2017 г.-02-17 14:двадцатьx86_64 Msys
трепать --версия
GNUтрепать, версия 4.4.12(1)-выпускать(x86_64-pc-msys)

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

безымянный
Linux 4.9.0-8-amd64# 1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU / Linux
трепать --версия
GNUтрепать, версия 4.4.12(1)-выпускать(x86_64-ПК-Linux-GNU)

скип не летает.

Функция

пропускать() { читать -u 31 год;}

Команды

пропускать
выбросилстрока пропущена
правда

Выход

(пустой)

Нижняя линия

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