Linux. Команда read

18.03.2018

Теги: BashCLILinuxstdinКомандаПеременная

Общая форма этой команды выглядит следующим образом:

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

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.