Чтение онлайн

ЖАНРЫ

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

if [ "$?" -eq $SUCCESS ]

then

echo "Нажата клавиша \"."

exit $SUCCESS

fi

echo -n "$key" | grep "$insert"

if [ "$?" -eq $SUCCESS ]

then

echo "Нажата клавиша \"Insert\"."

exit $SUCCESS

fi

echo -n "$key" | grep "$delete"

if [ "$?" -eq $SUCCESS ]

then

echo "Нажата

клавиша \"Delete\"."

exit $SUCCESS

fi

echo " Нажата какая-то другая клавиша."

exit $OTHER

# Упражнения:

# ---------

# 1) Упростите сценарий, заменив множество if-ов

#+ одной конструкцией 'case'.

# 2) Добавьте определение нажатий на клавиши "Home", "End", "PgUp" и "PgDn".

Ключ – t позволяет ограничивать время ожидания ввода командой read (см. Пример 9-4).

Команда read может считывать значения для переменных из файла, перенаправленного на stdin. Если файл содержит не одну строку, то переменной будет присвоена только первая строка. Если команде read будет передано несколько переменных, то первая строка файла будет разбита, по пробелам, на несколько подстрок, каждая из которых будет записана в свою переменную. Будьте осторожны!

Пример 11-6. Чтение командой read из файла через перенаправление

#!/bin/bash

read var1 <data-file

echo "var1 = $var1"

# Первая строка из "data-file" целиком записывается в переменную var1

read var2 var3 <data-file

echo "var2 = $var2 var3 = $var3"

# Обратите внимание!

# Поведение команды "read" далеко от ожидаемого!

# 1) Произошел возврат к началу файла.

# 2) Вместо того, чтобы последовательно читать строки из файла,

# по числу переменных, первая строка файла была разбита на подстроки,

# разделенные пробелами, которые и были записаны в переменные.

# 3) В последнюю переменную была записана вся оставшаяся часть строки.

# 4) Если команде "read" будет передано большее число переменных, чем подстрок

# в первой строке файла, то последние переменные останутся "пустыми".

echo "------------------------------------------------"

#

Эта проблема легко разрешается с помощью цикла:

while read line

do

echo "$line"

done <data-file

# Спасибо Heiner Steven за разъяснения.

echo "------------------------------------------------"

# Разбор строки, разделенной на поля

# Для задания разделителя полей, используется переменная $IFS,

echo "Список всех пользователей:"

OIFS=$IFS; IFS=: # В файле /etc/passwd, в качестве разделителя полей

# используется символ ":" .

while read name passwd uid gid fullname ignore

do

echo "$name ($fullname)"

done </etc/passwd # перенаправление ввода.

IFS=$OIFS # Восстановление предыдущего состояния переменной $IFS.

# Эту часть кода написал Heiner Steven.

# Если переменная $IFS устанавливается внутри цикла,

#+ то отпадает необходимость сохранения ее первоначального значения

#+ во временной переменной.

# Спасибо Dim Segebart за разъяснения.

echo "------------------------------------------------"

echo "Список всех пользователей:"

while IFS=: read name passwd uid gid fullname ignore

do

echo "$name ($fullname)"

done </etc/passwd # перенаправление ввода.

echo

echo "Значение переменной \$IFS осталось прежним: $IFS"

exit 0

Передача информации, выводимой командой echo, по конвейеру команде read, будет вызывать ошибку.

Тем не менее, передача данных по конвейеру от cat, кажется срабатывает.

cat file1 file2 |

while read line

do

echo $line

done

Файловая система

cd

Уже знакомая нам команда cd, изменяющая текущий каталог, может быть использована в случаях, когда некоторую команду необходимо запустить только находясь в определенном каталоге.

(cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xpvf -)

Поделиться с друзьями: