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 • Команда • Переменная