Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Название:Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Автор:
- Жанр:
- Издательство:Питер
- Год:2017
- Город:СПб.
- ISBN:978-5-496-03029-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание краткое содержание
Цель этой книги — продемонстрировать практические приемы программирования сценариев на bash и познакомить с самыми распространенными утилитами на коротких и компактных примерах, не вдаваясь в излишние подробности. Экспериментируйте с этими сценариями — ломайте, исправляйте и приспосабливайте их под свои нужды, чтобы понять, как они работают. Только так вы сможете решать самые сложные задачи.
Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
№ 28. Перенос длинных строк
Одно из ограничений команды fmt и эквивалентного ей сценария № 14 из главы 2 состоит в том, что они переносят и оформляют отступы во всех строках, которые встретятся им на пути, даже если в этом нет никакого смысла. В результате текст электронного письма может превратиться в абракадабру (например, перенос слова. signature — не самое лучшее решение), как и содержимое любого другого файла, где переносы строк играют важную роль.
А что, если вам потребуется реализовать перенос только очень длинных строк в документе, оставив все остальное нетронутым? С набором команд, доступным пользователю Unix по умолчанию, остается только одно: вручную просмотреть все строки в редакторе, по отдельности передавая длинные команде fmt. (В редакторе vi для этого достаточно установить курсор на требуемую строку и выполнить команду!$fmt.)
Сценарий в листинге 4.3 автоматизирует задачу, используя конструкцию ${# varname }, которая возвращает длину строки, хранящейся в переменной varname .
Код
Листинг 4.3.Сценарий toolong
··#!/bin/bash
··# toolong — передает команде fmt только строки из потока ввода,
··#·· которые длиннее указанного предела
··width=72
··if [! -r "$1"]; then
····echo "Cannot read file $1" >&2
····echo "Usage: $0 filename" >&2
····exit 1
··fi
while read input
··do
····if [${#input} −gt $width]; then
······echo "$input" | fmt
····else
······echo "$input"
····fi
done < $1
··exit 0
Как это работает
Обратите внимание, что простая конструкция < $1 в конце цикла while подает на его вход указанный файл. Каждая строка из этого файла читается командой read input
и сохраняется в переменной input для дальнейшего анализа.
Если ваша командная оболочка не поддерживает конструкцию ${# var }, ее поведение можно сымитировать очень удобной командой «word count» (счетчик слов) wc:
varlength="$(echo "$var" | wc −c)"
Однако wc имеет один неприятный недостаток: она добавляет ведущие пробелы в свой вывод для выравнивания значений в выходном листинге. Избавиться от этой досадной проблемы можно, внеся небольшие изменения в команду, чтобы оставить в выводе только цифры, как показано ниже:
varlength="$(echo "$var" | wc −c | sed 's/[^[: digit: ]]//g')"
Запуск сценария
Этот сценарий принимает единственное имя файла, как показано в листинге 4.4.
Результаты
Листинг 4.4.Тестирование сценария toolong
$ toolong ragged.txt
So she sat on, with closed eyes, and half believed herself in
Wonderland, though she knew she had but to open them again, and
all would change to dull reality-the grass would be only rustling
in the wind, and the pool rippling to the waving of the reeds-the
rattling teacups would change to tinkling sheep-bells, and the
Queen's shrill cries to the voice of the shepherd boy-and the
sneeze
of the baby, the shriek of the Gryphon, and all the other queer
noises, would change (she knew) to the confused clamour of the busy
farm-yard-while the lowing of the cattle in the distance would
take the place of the Mock Turtle's heavy sobs.
Обратите внимание, что в отличие от стандартной команды fmt сценарий toolong оставил переносы строк на месте, где это возможно. Так, слово sneeze , которое в исходном файле находится в отдельной строке, осталось в отдельной строке и в полученном выводе.
№ 29. Вывод файла с дополнительной информацией
Многие распространенные команды Unix и Linux первоначально создавались для работы с медленными, преимущественно неинтерактивными средствами вывода (мы уже упоминали, что Unix — это довольно древняя ОС?) и потому выводят минимум информации и не поддерживают интерактивного режима работы. Примером может служить команда cat: когда она используется для просмотра коротких файлов, она не выводит никакой полезной информации о файле. Однако было бы нелишне иметь такую информацию, так давайте получим ее! В листинге 4.5 приводится реализация команды showfile, альтернативы команде cat.
Код
Листинг 4.5.Сценарий showfile
··#!/bin/bash
··# showfile — выводит содержимое файла и дополнительную информацию
··width=72
··for input
··do
····lines="$(wc −l < $input | sed 's/ //g')"
····chars="$(wc −c < $input | sed 's/ //g')"
····owner="$(ls −ld $input | awk '{print $3}')"
····echo "---------"
····echo "File $input ($lines lines, $chars characters, owned by $owner):"
····echo "---------"
····while read line
····do
······if [${#line} −gt $width]; then
········echo "$line" | fmt | sed −e '1s/^/ /' −e '2,$s/^/+ /'
······else
········echo " $line"
······fi
····done < $input
····echo "---------"
··done | ${PAGER: more}
··exit 0
Как это работает
Чтобы вместе с содержимым файла вывести заголовок и заключительную информацию, этот сценарий использует интересный трюк, доступный в командной оболочке: ближе к концу сценария, с помощью конструкции done < $input , выполняется перенаправление входного файла в цикл while. Но самым сложным, пожалуй, элементом сценария является вызов sed для вывода строк длиннее указанной величины:
echo "$line" | fmt | sed −e '1s/^/ /' −e '2,$s/^/+ /'
Строки, имеющие длину больше указанного максимального значения, переносятся с помощью команды fmt (вместо нее можно использовать эквивалентный сценарий № 14 из главы 2). Чтобы визуально отличать строки, которые продолжаются на следующей строке в выводе, от строк, оставшихся нетронутыми, перед первой строкой намеренно добавляются два пробела, а перед последующими — знак «плюс» и один пробел. В конце вывод передается через конвейер команде ${PAGER: more} постраничного просмотра, заданной в переменной окружения $PAGER, или, если эта переменная не настроена, программе more .
Запуск сценария
Сценарию можно передать одно или несколько имен файлов, как показано в листинге 4.6.
Результаты
Листинг 4.6.Тестирование сценария showfile
$ showfile ragged.txt
---------
File ragged.txt (7 lines, 639 characters, owned by taylor):
---------
··So she sat on, with closed eyes, and half believed herself in
··Wonderland, though she knew she had but to open them again, and
··all would change to dull reality-the grass would be only rustling
+ in the wind, and the pool rippling to the waving of the reeds-the
··rattling teacups would change to tinkling sheep-bells, and the
··Queen's shrill cries to the voice of the shepherd boy-and the
Интервал:
Закладка: