Категории
Самые читаемые
PochitayKnigi » Компьютеры и Интернет » Программирование » Искусство программирования на языке сценариев командной оболочки - Мендель Купер

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 37 38 39 40 41 42 43 44 45 ... 96
Перейти на страницу:

# поскольку "*" возвращает имена, не содержащие "/".

do n=`echo "$filename/" | tr '[:upper:]' '[:lower:]'`

# символьные классы POSIX.

# Завершающий слэш добавлен для того, чтобы символ перевода строки

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

# Подстановка переменной:

n=${n%/} # Удаление завершающего слэша, добавленного выше.

[[ $filename == $n ]] || mv "$filename" "$n"

# Проверка -- действительно ли изменилось имя файла.

done

exit 0

Пример 12-16. du: Преобразование текстового файла из формата DOS в формат UNIX.

#!/bin/bash

# du.sh: Преобразование текстового файла из формата DOS в формат UNIX.

E_WRONGARGS=65

if [ -z "$1" ]

then

echo "Порядок использования: `basename $0` filename-to-convert"

exit $E_WRONGARGS

fi

NEWFILENAME=$1.unx

CR='15' # Возврат каретки.

# Строки в текстовых файлах DOS завершаются комбинацией символов CR-LF.

tr -d $CR < $1 > $NEWFILENAME

# Удалить символы CR и записать в новый файл.

echo "Исходный текстовый файл: "$1"."

echo "Преобразованный файл: "$NEWFILENAME"."

exit 0

Пример 12-17. rot13: Сверхслабое шифрование по алгоритму rot13.

#!/bin/bash

# rot13.sh: Классический алгоритм шифрования rot13,

# который способен "расколоть" даже 3-х летний ребенок.

# Порядок использования: ./rot13.sh filename

# или ./rot13.sh <filename

# или ./rot13.sh и ввести текст с клавиатуры (stdin)

cat "[email protected]" | tr 'a-zA-Z' 'n-za-mN-ZA-M' # "a" заменяется на "n", "b" на "o", и т.д.

# Конструкция 'cat "[email protected]"'

#+ позволяет вводить данные как со stdin, так и из файла.

exit 0

Пример 12-18. Более "сложный" шифр

#!/bin/bash

# crypto-quote.sh: Ограниченное шифрование

# Шифрование ограничивается простой заменой одних алфавитных символов другими.

# Результат очень похож на шифры-загадки

key=ETAOINSHRDLUBCFGJMQPVWZYXK

# Здесь, "key" -- ни что иное, как "перемешанный" алфавит.

# Изменение ключа "key" приведет к изменению шифра.

# Конструкция 'cat "[email protected]"' позволяет вводить данные как со stdin, так и из файла.

# Если используется stdin, то ввод должен завершаться комбинацией Control-D.

# Иначе, в командной строке, сценарию должно быть передано имя файла.

cat "[email protected]" | 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 "[email protected]" | 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.

Очень мощной альтернативой утилите fmt, является утилита par (автор Kamil Toman), которую вы сможете найти на http://www.cs.berkeley.edu/~amc/Par/.

col

Эта утилита с обманчивым названием удаляет из входного потока символы обратной подачи бумаги (код ESC 7). Она так же пытается заменить пробелы на табуляции. Основная область применения утилиты col -- фильтрация вывода отдельных утилит обработки текста, таких как groff и tbl.

column

Форматирование по столбцам. Эта утилита преобразует текст, например какой либо список, в табличное, более "удобочитаемое", представление, вставляя символы табуляции по мере необходимости.

Пример 12-20. Пример форматирования списка файлов в каталоге

#!/bin/bash

# За основу сценария взят пример "man column".

(printf "PERMISSIONS LINKS OWNER GROUP SIZE DATE TIME PROG-NAMEn"

; 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.

Если файл содержит символы табуляции или непечатаемые символы, то результат может получиться самым неожиданным. В таких случаях, как правило, утилиту colrm, в конвейере, окружают командами expand и unexpand.

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

pr

Подготовка файла к печати. Утилита производит разбивку файла на страницы, приводя его в вид пригодный для печати или для вывода на экран. Разнообразные ключи позволяют выполнять различные манипуляции над строками и колонками, соединять строки, устанавливать поля, нумеровать строки, добавлять колонтитулы и многое, многое другое. Утилита pr соединяет в себе функциональность таких команд, как nl, paste, fold, column и expand.

pr -o 5 --width=65 fileZZZ | more -- выдаст хорошо оформленное и разбитое на страницы содержимое файла fileZZZ.

Хочу особо отметить ключ -d, который выводит строки с двойным интервалом (тот же эффект, что и sed -G).

gettext

GNU утилита, предназначена для нужд локализации и перевода сообщений программ, выводимых на экран, на язык пользователя. Не смотря на то, что это актуально, прежде всего, для программ на языке C, тем не менее gettext с успехом может использоваться в сценариях командной оболочки для тех же целей. См. info page.

iconv

Утилита преобразования текста из одной кодировки в другую. В основном используется для нужд локализации.

recode

Может рассматриваться как разновилность утилиты iconv, описанной выше. Универсальная утилита для преобразования текстовой информации в различные кодировки.

1 ... 37 38 39 40 41 42 43 44 45 ... 96
Перейти на страницу:
Тут вы можете бесплатно читать книгу Искусство программирования на языке сценариев командной оболочки - Мендель Купер.
Комментарии