Искусство программирования на языке сценариев командной оболочки
Шрифт:
# Иначе, в командной строке, сценарию должно быть передано имя файла.
cat "$@" | tr "a-z" "A-Z" | tr "A-Z" "$key"
# | в верхний регистр | шифрование
# Такой прием позволяет шифровать как символы в верхнем регистре, так и в нижнем.
# Неалфавитные символы остаются без изменений.
# Попробуйте зашифровать какой либо текст, например
# "Nothing so needs reforming as other people's habits."
# --Mark Twain
#
#
# "CFPHRCS QF CIIOQ MINFMBRCS EQ FPHIM GIFGUI'Q HETRPQ."
# --BEML PZERC
# Для дешифрации можно использовать следующую комбинацию:
# cat "$@" | tr "$key" "A-Z"
# Этот нехитрый шифр может быть "взломан" 12-ти летним ребенком
#+ с помощью карандаша и бумаги.
exit 0
Различные версии tr
Утилита tr имеет две, исторически сложившиеся, версии. BSD-версия не использует квадратные скобки (tr a-z A-Z), в то время как SysV-версия использует их (tr '[a-z]' '[A-Z]'). GNU-версия утилиты tr напоминает версию BSD, но диапазоны символов обязательно должны заключаться в квадратные скобки.
fold
Выравнивает текст по ширине, разрывая, если это необходимо, слова. Особый интерес представляет ключ – s, который производит перенос строк по пробелам, стараясь не разрывать слова. (см. Пример 12-19 и Пример A-2).
fmt
Очень простая утилита форматирования текста, чаще всего используемая как фильтр в конвейерах для того, чтобы выполнить "перенос" длинных строк текста.
Пример 12-19. Отформатированный список файлов.
#!/bin/bash
WIDTH=40 # 40 символов в строке.
b=`ls /usr/local/bin` # Получить список файлов...
echo $b | fmt -w $WIDTH
# То же самое можно выполнить командой
# echo $b | fold - -s -w $WIDTH
exit 0
См. также Пример 12-4.
col
Эта утилита с обманчивым названием удаляет из входного потока символы обратной подачи бумаги (код ESC 7). Она так же пытается заменить пробелы на табуляции. Основная область применения утилиты col– - фильтрация вывода отдельных утилит обработки текста, таких как groff и tbl.
column
Форматирование по столбцам. Эта утилита
преобразует текст, например какой либо список, в табличное, более "удобочитаемое", представление, вставляя символы табуляции по мере необходимости.Пример 12-20. Пример форматирования списка файлов в каталоге
#!/bin/bash
# За основу сценария взят пример "man column".
(printf "PERMISSIONS LINKS OWNER GROUP SIZE DATE TIME PROG-NAME\n" \
; ls -l | sed 1d) | column -t
# Команда "sed 1d" удаляет первую строку, выводимую командой ls,
#+ (для локали "С" это строка: "total N",
#+ где "N" -- общее количество файлов.
# Ключ -t, команды "column", означает "табличное" представление.
exit 0
colrm
Утилита удаления колонок. Удаляет колонки (столбцы) сиволов из файла и выводит результат на stdout. colrm 2 4 <filename– - удалит символы со 2-го по 4-й включительно, в каждой строке в файле filename.
nl
Нумерует строки в файле. nl filename– - выведет файл filename на stdout, и в начале каждой строки вставит ее порядковый номер, счет начинается с первой непустой строки. Если файл не указывается, то принимается ввод со stdin.
Вывод команды nl очень напоминает cat -n, однако, по-умолчанию nl не нумерует пустые строки.
Пример 12-21. nl: Самонумерующийся сценарий.
#!/bin/bash
# Сценарий выводит себя сам на stdout дважды, нумеруя строки сценария.
# 'nl' вставит для этой строки номер 3, поскольку она не нумерует пустые строки.
# 'cat -n' вставит для этой строки номер 5.
nl `basename $0`
echo; echo # А теперь попробуем вывести текст сценария с помощью 'cat -n'
cat -n `basename $0`
# Различия состоят в том, что 'cat -n' нумерует все строки.
# Обратите внимание: 'nl -ba' -- сделает то же самое.
exit 0