Встроенная команда чтения Bash

Обновлено: 31.12.2020, автор: Computer Hope

При работе в стиле Unix систем, read — это встроенная команда оболочки Bash. Он считывает строку текста из стандартного ввода и разбивает ее на слова. Эти слова затем можно использовать в качестве входных для других команд.

  • Описание
  • Синтаксис
  • Примеры
  • Связанные команды
  • Справка по встроенным командам Bash
  • Справка по командам Linux

Описание

read : считывает одну строку из стандартного ввода или из дескриптора файла fd , если Используется параметр -u (см. -u ниже).

По умолчанию читать считает символ новой строки концом строки, но это можно изменить с помощью параметра -d .

После чтения строка разделяется на слова в соответствии со значением специальной переменной оболочки IFS , внутреннего разделителя полей. По умолчанию значение IFS — «пробел, табуляция или новая строка». Если read встречает читаемые символы до встречи с IFS, он считает эти символы словом. (Для получения дополнительной информации о IFS см. Разделение слов в bash.)

Совет

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

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

Если name не указано, ввод сохраняется в переменной с именем REPLY .

Синтаксис

  read  [ -ers ] [ -a   массив ] [ -d   delim ] [ -i   text ] [ -n   nchars ] [ -N   nchars ] [ -p   prompt ] [   -t   тайм-аут ] [ -u   fd ] [ имя  ...] [ name2  ...] 

Параметры

Встроенная команда чтения принимает следующие параметры:

-a array Сохраните слова в индексированном массиве с именем array . Нумерация элементов массива начинается с нуля.
-d delim Установите для символа разделителя значение delim . Этот символ сигнализирует об окончании строки. Если -d не используется, разделителем строк по умолчанию является новая строка.
-e Получить строку ввода из интерактивной оболочки. Пользователь вручную вводит символы до тех пор, пока не будет достигнут разделитель строк..
-i text При использовании в сочетании с -e (и только если -s не используется), текст вставляется как начальный текст входной строки. Пользователь может редактировать текст в строке ввода.
-n nchars Остановить чтение после того, как будет прочитано целое число символов nchars , если разделитель строк не достигнут.
-N nchars Игнорировать разделитель строк . Остановить чтение только после того, как будут прочитаны символы nchars , достигнут EOF или истечет время чтения (см. -t).
-p prompt Распечатать строку prompt без новой строки, перед началом чтения.
-r Используйте «сырой ввод». В частности, эта опция заставляет read интерпретировать обратную косую черту буквально, а не интерпретировать их как escape-символы.
-s Не отображать нажатия клавиш, когда read принимает ввод с терминала.
-t timeout Тайм-аут и возврат ошибки, если вся строка ввода не прочитано в течение timeout секунд. Если значение тайм-аута равно нулю, read не будет читать никаких данных, но возвращает успех, если вход был доступен для чтения. Если timeout не указан, вместо него используется значение переменной оболочки TMOUT , если она существует. Значением timeout являются дробные числа, например, 3.5.
-u fd Читать из файлового дескриптора fd вместо стандартного ввода. Дескриптор файла должен быть небольшим целым числом. Для получения информации об открытии пользовательского дескриптора файла см. Раздел «Открытие файловых дескрипторов в bash».

Статус выхода

Статус выхода чтение равно нулю, если не встречается EOF, превышен тайм-аут, возникает ошибка при присвоении значения name или дескриптору файла, предоставленному для — u недействителен.

Если тайм-аут превышен, статус выхода больше 128.

Примеры

  пока читал;  эхо "$ REPLY";  done 

read принимает данные с терминала. Введите все, что хотите, и нажмите Enter . Текст отображается на следующей строке. Этот цикл продолжается до тех пор, пока вы не нажмете Ctrl + D (EOF) на новой строке. Поскольку имена переменных не указаны, вся строка текста сохраняется в переменной REPLY .

 при чтении текста;  сделать echo "$ text";  done 

То же, что и выше, с использованием имени переменной text .

 при чтении -ep "Введите что-нибудь:" -i "  Мой текст - это «текст;  do echo "$ text"; done 

Предоставляет подсказку и начальный текст для ввода пользователем. Пользователь может стереть «Мой текст» или оставить как часть ввода. Ввод Ctrl + D в новой строке завершает цикл.

 echo "Hello, world!"  |  (read; echo "$ REPLY") 

Заключение команд read и echo в круглые скобки выполняет их в специальной подоболочке . Это позволяет обращаться к переменной REPLY как для read , так и для echo . Для получения дополнительной информации см. Среды выполнения команд bash: подоболочки.

 echo "one two three four" |  пока читал слово1 слово2 слово3;  сделать echo "word1: $ word1" echo "word2: $ word2" echo "word3: $ word3" done 

Echo «one two three four» и передать его по конвейеру while цикл, где read считывает первое слово в word1 , второе в word2 и все остальное в word3 . Вывод:

 word1: oneword2: twoword3: три четыре 
 echo "один два три четыре" |  при чтении - массив слов;  do echo $ {wordarray [1]} done 

То же, что и выше, но присваивает слова элементам индексированного массива wordarray . Нумерация начинается с нуля, поэтому $ {wordarray [1]} возвращает второе слово. Для получения дополнительной информации см. Массивы bash. Вывод:

 two 
, а IFS = read -r -d $ ' 0' file;  do echo "$ file" done  

Приведенные выше команды являются "правильным" способом использования find и читать вместе для обработки файлов. Это особенно полезно, когда вы хотите что-то сделать с большим количеством файлов со странными или необычными именами. Давайте посмотрим на определенные части приведенного выше примера:

 while IFS = 

IFS = (без ничего после равенства sign) устанавливает для внутреннего разделителя полей значение "без значения". Таким образом, пробелы, табуляции и новые строки считаются частью слова, которое сохраняет пробелы в именах файлов.

Обратите внимание, что IFS = идет после while , гарантируя, что IFS изменяется только внутри цикла while . Например, это не повлияет на find .

 read -r 

Использование -r необходим для сохранения любых обратных косых черт в именах файлов.

 -d $ ' 0' 

-d опция устанавливает разделитель новой строки. Здесь мы устанавливаем его на символ NULL, нулевой код ASCII. (Экранированный ноль, заключенный в одинарные кавычки, которому предшествует знак доллара, интерпретируется bash как NULL. Для получения дополнительной информации см .: Расширение строк с помощью интерпретируемых escape-символов в документации bash.)

Мы ' re использует NULL в качестве разделителя строк, потому что имена файлов Linux могут содержать символы новой строки, поэтому нам нужно их сохранить. (Звучит ужасно, но да, такое бывает.)

Однако NULL никогда не может быть частью имени файла Linux, так что это надежный разделитель. К счастью, find может использовать NULL для ограничения результатов, а не новую строку, если указан параметр -print0 :

  

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

Заключение Команда find в ... ) выполняет подстановку процесса: вывод команды можно читать как файл. В свою очередь, этот вывод перенаправляется в цикл while с использованием первого « ».

Каждая итерация while цикл read читает одно слово (одно имя файла) и помещает это значение в переменную file , которую мы указан в качестве последнего аргумента команды read .

Когда больше нет имен файлов для чтения, read возвращает false , который запускает конец цикла while , и последовательность команд завершается.

Связанные команды

while - выполнить набор действий, пока выполняется определенное условие.
find - поиск файлов в иерархии каталогов.

Оцените статью
Botgadget.ru
Добавить комментарий