Linux. Команда read
Общая форма этой команды выглядит следующим образом:
read [опции] переменная1 переменная2 …
Когда выполняется эта команда, оболочка читает строку из стандартного ввода и присваивает первое слово первой переменной, второе слово — второй переменной и т.д. Если же слов в строке оказывается больше, чем переменных, лишние слова присваиваются последней переменной.
- Опция
-tпозволяет указатьtimeoutв секундах, после которого команда отдаст управление назад в скрипт. - Опция
-sскрывает ввод; это нужно для получения каких-то конфиденциальных данных, например пароля. - Опция
-dуказывает символ, при появлении которого чтение ввода нужно завершить; по умолчанию это символ переноса строки. - Опция
-p строкапоказывает строку приглашения без оконечного перевода строки; обычно с помощью этой опции выводят подсказку, перед тем как команда будет считывать данные. - Опция
-uзадает дескриптор файла для чтения входных данных.
Если команде не было передано ни одной переменной, то ввод будет сохранен в переменную $REPLY. Код возврата равен нулю, пока не встретился символ конца файла, не возник таймаут или дескриптор файла не оказался недопустимым.
Команда read часто используется в цикле while для построчного чтения файла. Команда read возвращает нулевой код завершения до тех пор, пока не обнаружит конец файла. Если данные поступают с терминала, это означает, что пользователь нажал комбинацию клавиш Ctrl+D.
while read line ; do команда1 команда2 ........ done < data.txt
В качестве примера выведем список всех пользователей из файла /etc/passwd:
$ while read line; do echo "$line" | cut -f1 -d:; done < /etc/passwd root daemon bin .....
Ниже приведен пример скрипта, который называется number и является упрощенной версией стандартной команды nl. Он принимает в качестве аргументов один или несколько файлов и отображает их содержимое в отдельно пронумерованных строках. Если же аргументы не заданы, скрипт читает данные из стандартного ввода.
#!/bin/bash number=1 cat "$@" | while read line ; do echo "$number: $line" ((number++)) done
$ cat linux.txt Ubuntu Redhat Centos Debian Fedora $ ./number linux.txt 1: Ubuntu 2: Redhat 3: Centos 4: Debian 5: Fedora
$ cat /etc/passwd | ./number 1: root:x:0:0:root:/root:/bin/bash 2: daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin 3: bin:x:2:2:bin:/bin:/usr/sbin/nologin ..........
И еще один скрипт, который представляет собой упрощенную версию команды cp:
#!/bin/bash # Скрипт копирует файл из source в target; source может быть списком файлов, тогда target # должен быть каталогом. numargs=$# # количество аргументов source_list="" # список исходных файлов copy_list="" # список конечных файлов # # Обрабатываем аргументы, сохраняя в переменной source_list все, кроме последнего аргумента # while [ "$#" -gt 1 ] ; do source_list="$source_list $1" shift done target="$1" # файл или директория # # Если количество аргументов меньше двух или количество аргументов больше двух, но последний # аргумент не является каталогом, вывести сообщение об ошибке и завершить работу # if [ "$numargs" -lt 2 -o "$numargs" -gt 2 -a ! -d "$target" ] ; then echo "Использование: $0 file1 file2" echo "Или так: $0 file(s) dir" exit 1 fi # # Перебрать каждый файл в переменной source_list # for item in $source_list ; do # Выяснить, является ли целевой файл каталогом if [ -d "$target" ] ; then target_file="$target/$(basename $item)" else target_file="$target" fi # Добавить имя файла к переменной copy_list если файл еще не существует или если # пользователь дает разрешение на его перезапись if [ -e "$target_file" ] ; then echo -n "Файл $target_file уже существует. Перезаписать (да/нет)?" read answer if [ "$answer" = "да" ] ; then copy_list="$copy_list $item" fi else copy_list="$copy_list $item" fi done # # Теперь проверяем, что список файлов для копирования не пустой, и можно копировать # if [ -n "$copy_list" ] ; then cp $copy_list $target fi
Поиск: $REPLY • Bash • CLI • Linux • read • stdin • Команда • Переменная