··#·· которые длиннее указанного предела
··width=72
··if [! -r "$1"]; then
····echo "Cannot read file $1" >&2
····echo "Usage: $0 filename" >&2
····exit 1
··fi
··do
····if [${#input} −gt $width]; then
······echo "$input" | fmt
····else
······echo "$input"
····fi
··exit 0
Как это работает
Обратите внимание, что простая конструкция < $1 в конце цикла while
Если ваша командная оболочка не поддерживает конструкцию ${#
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 оставил переносы строк на месте, где это возможно. Так, слово
№ 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
····echo "---------"