Что читается?
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
Команды
выбросил {1..10} |карта pow
Выход
14
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}
сделано
Выход
12
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. Иногда исследование с использованием дескрипторов чтения и файлов может дать пасхальные яйца.