Пример 11-6. Чтение командой 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 -)
[взято из упоминавшегося ранее примера]
Команда cd с ключом -P (physical) игнорирует символические ссылки.
Команда "cd -" выполняет переход в каталог $OLDPWD -- предыдущий рабочий каталог.
Неожиданным образом выполняется команда cd, если ей передать, в качестве каталога назначения, два слэша.
bash$ cd //
bash$ pwd
//
Само собой разумеется, это должен был бы быть каталог /. Эта проблема наблюдается как в командной строке, так и в сценариях.
pwd
Выводит название текущего рабочего каталога (Print Working Directory) (см. Пример 11-7). Кроме того, имя текущего каталога хранится во внутренней переменной $PWD.
pushd, popd, dirs
Этот набор команд является составной частью механизма "закладок" на каталоги и позволяет перемещаться по каталогам вперед и назад в заданном порядке. Для хранения имен каталогов используется стек (LIFO -- "последний вошел, первый вышел").
pushd dir-name -- помещает имя текущего каталога в стек и осуществляет переход в каталог dir-name.
popd -- выталкивает, находящееся на вершине стека, имя каталога и одновременно осуществляет переход в каталог, оказавшийся на врешине стека.
dirs -- выводит содержимое стека каталогов (сравните с переменной $DIRSTACK). В случае успеха, обе команды -- pushd и popd автоматически вызывают dirs.
Эти команды могут оказаться весьма полезными, когда в сценарии нужно производить частую смену каталогов, но при этом не хочется жестко "зашивать" имена каталогов. Обратите внимание: содержимое стека каталогов постоянно хранится в переменной-массиве -- $DIRSTACK.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Чтение файла
Чтение файла BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) Возвращаемое значение: в случае успешного выполнения (которое считается таковым, даже если не был считан ни один байт из-за попытки чтения с выходом за пределы файла) — TRUE, иначе —
10.1.21. Чтение всего файла в память
10.1.21. Чтение всего файла в память Чтобы прочитать весь файл в массив, не нужно даже его предварительно открывать. Все сделает метод IO.readlines: откроет файл, прочитает и закроет.arr = IO.readlines("myfile")lines = arr.sizeputs "myfile содержит #{lines} строк."longest = arr.collect {|x| x.length}.maxputs "Самая длинная строка
10.1.22. Построчное чтение из файла
10.1.22. Построчное чтение из файла Чтобы читать по одной строке из файла, можно обратиться к методу класса IO.foreach или к методу экземпляра each. В первом случае файл не нужно явно открывать.# Напечатать все строки, содержащие слово "target".IO.foreach("somefile") do |line| puts line if line =~ /target/end# Другой
10.1.23. Побайтное чтение из файла
10.1.23. Побайтное чтение из файла Для чтения из файла по одному байту служит метод экземпляра each_byte. Напомним, что он передает в блок символ (то есть целое число); воспользуйтесь методом chr, если хотите преобразовать его в «настоящий» символ.file = File.new("myfile")e_count = 0file.each_byte do
Чтение из текстового файла
Чтение из текстового файла Теперь выясним, как программными средствами читать данные из файла, используя соответствующий тип StreamReader. Вы должны помнить, что этот класс получается из TextReader, функциональные возможности которого описаны в табл. 16.8.Таблица 16.8. Основные члены
Чтение одиночного файла
Чтение одиночного файла Каким может быть идеальный признак STOP? Это должен быть такой символ, который обычно не используется в тексте и следовательно, не приводит к ситуации, когда он случайно встретится при вводе, и работа программы будет остановлена раньше чем мы
Пример 9-4. Ограничение времени ожидания команды read
Пример 9-4. Ограничение времени ожидания команды read #!/bin/bash# t-out.sh TIMELIMIT=4 # 4 секундыread -t $TIMELIMIT variable <&1echoif [ -z "$variable" ]then echo "Время ожидания истекло."else echo "variable = $variable"fi exit 0$UIDuser id numberUID (идентификатор) текущего пользователя, в соответствии с /etc/passwdЭто реальный UID текущего
Пример 10-13. Работа с командой efax в пакетном режиме
Пример 10-13. Работа с командой efax в пакетном режиме #!/bin/bashEXPECTED_ARGS=2E_BADARGS=65if [ $# -ne $EXPECTED_ARGS ]# Проверка наличия аргументов командной строки.then echo "Порядок использования: `basename $0` phone# text-file" exit $E_BADARGSfiif [ ! -f "$2" ]then echo "Файл $2 не является текстовым файлом" exit $E_BADARGSfifax make $2 #
Пример 11-4. Ввод многострочного текста с помощью read
Пример 11-4. Ввод многострочного текста с помощью read #!/bin/bashechoecho "Введите строку, завершающуюся символом , и нажмите ENTER."echo "Затем введите вторую строку, и снова нажмите ENTER."read var1 # При чтении, символ "" экранирует перевод строки. # первая строка # вторая
Пример 16-4. Перенаправление в цикл while
Пример 16-4. Перенаправление в цикл while #!/bin/bashif [ -z "$1" ]then Filename=names.data # По-умолчанию, если имя файла не задано.else Filename=$1fi# Конструкцию проверки выше, можно заменить следующей строкой (подстановка параметров):#+ Filename=${1:-names.data}count=0echowhile [ "$name" != Smith ] # Почему переменная $name взята
Пример 16-6. Перенаправление в цикл until
Пример 16-6. Перенаправление в цикл until #!/bin/bash# То же самое, что и в предыдущем примере, только для цикла "until".if [ -z "$1" ]then Filename=names.data # По-умолчанию, если файл не задан.else Filename=$1fi# while [ "$name" != Smith ]until [ "$name" = Smith ] # Проверка != изменена на =.do read name # Чтение из $Filename, не со
Пример 16-9. Перенаправление в конструкции if/then
Пример 16-9. Перенаправление в конструкции if/then #!/bin/bashif [ -z "$1" ]then Filename=names.data # По-умолчанию, если файл не задан.else Filename=$1fiTRUE=1if [ "$TRUE" ] # конструкции "if true" и "if :" тоже вполне допустимы.then read name echo $namefi <"$Filename"# ^^^^^^^^^^^^# Читает только первую строку из файла.exit
Чтение из архивного файла
Чтение из архивного файла В предыдущем разделе мы рассказали как сохранить объект вашего класса в архивном файле. Теперь опишем, как восстановить записанное ранее состояние объекта класса из архивного файла. Когда приложение желает восстановить состояние объекта