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

Пример 12-40. Использование getopt для разбора аргументов командной строки

Пример 12-40. Использование getopt для разбора аргументов командной строки

#!/bin/bash

# ex33a.sh

# Попробуйте следующие варианты вызова этого сценария.

# sh ex33a -a

# sh ex33a -abc

# sh ex33a -a -b -c

# sh ex33a -d

# sh ex33a -dXYZ

# sh ex33a -d XYZ

# sh ex33a -abcd

# sh ex33a -abcdZ

# sh ex33a -z

# sh ex33a a

# Объясните полученные результаты.

E_OPTERR=65

if [ "$#" -eq 0 ]

then # Необходим по меньшей мере один аргумент.

echo "Порядок использования: $0 -[options a,b,c]"

exit $E_OPTERR

fi

set -- `getopt "abcd:" "$@"`

# Запись аргументов командной строки в позиционные параметры.

# Что произойдет, если вместо "$@" указать "$*"?

while [ ! -z "$1" ]

do

case "$1" in

-a) echo "Опция "a"";;

-b) echo "Опция "b"";;

-c) echo "Опция "c"";;

-d) echo "Опция "d" $2";;

*) break;;

esac

shift

done

# Вместо 'getopt' лучше использовать встроенную команду 'getopts',

# См. "ex33.sh".

exit 0

run-parts

Команда run-parts[ 33 ] запускает на исполнение все сценарии, в порядке возрастания имен файлов-сценариев, в заданном каталоге. Естественно, файлы сценариев должны иметь права на исполнение.

Демон crond вызывает run-parts для запуска сценариев из каталогов /etc/cron.*.

yes

По-умолчанию, команда yes выводит на stdout непрерывную последовательность символов y, разделенных символами перевода строки. Исполнение команды можно прервать комбинацией клавиш control-c. Команду yes можно заставить выводить иную последовательность символов. Теперь самое время задаться вопросом о практической пользе этой команды. Основное применение этой команды состоит в том, что вывод от нее может быть передан, через конвейер, другой команде, ожидающей реакции пользователя. В результате получается, своего рода, слабенькая версия команды expect.

yes | fsck /dev/hda1 запускает fsck в неинтерактивном режиме (будьте осторожны!).

yes | rm -r dirname имеет тот же эффект, что и rm -rf dirname (будьте осторожны!).


Внимание! Передача вывода команды yes по конвейеру потенциально опасным командам, таким как fsck или fdisk может дать нежелательные побочные эффекты.

banner

Печатает на stdout заданную строку символов (не более 10), рисуя каждый символ строки при помощи символа '#'. Вывод от команды может быть перенаправлен на принтер.

printenv

Выводит все переменные окружения текущего пользователя.

bash$ printenv | grep HOME

HOME=/home/bozo

lp

Команды lp и lpr отправляют файлы в очередь печати[ 34 ] для вывода на принтер. Названия этих команд произошли от "line printers".

bash$lp file1.txt или bashlp <file1.txt

Очень часто используются в комбинации с командой форматированного вывода pr.

bash$pr -options file1.txt | lp

Программы подготовки текста к печати, такие как groff и Ghostscript, так же могут напрямую взаимодействовать с lp.

bash$groff -Tascii file.tr | lp

bash$gs -options | lp file.ps

Команда lpq предназначена для просмотра очереди заданий печати, а lprm -- для удаления заданий из очереди.

tee

[UNIX заимствовал эту идею из водопроводного дела.]

Это опрератор перенаправления, но с некоторыми особенностями. Подобно водопроводным трубам, "tee" позволяет "направить поток" данных в несколько файлов и на stdout одновременно, никак не влияя на сами данные. Эта команда может оказаться очень полезной при отладке.

tee

|------> в файл

|

===============|===============

command--->----|-operator-->---> результат работы команд(ы)

===============================

cat listfile* | sort | tee check.file | uniq > result.file

(Здесь, в файл check.file будут записаны данные из всех "listfile*", в отсортированном виде до того, как повторяющиеся строки будут удалены командой uniq.)

mkfifo

Эта, редко встречающаяся, команда создает именованный канал - очередь, через который производится обмен данными между процессами[ 35 ]. Как правило, один процесс записывает данные в очередь (FIFO), а другой читает данные из очереди. См. Пример A-17.

pathchk

Производит проверку полного имени файла -- проверяет, доступны ли на чтение, каталоги в пути к файлу, и не превышает ли длина полного имени файла 255 символов. При несоблюдении одного из условий -- возвращает сообщение об ошибке.

К сожалению, pathchk не возвращает соответствующего кода ошибки, и потому, в общем-то, бесполезна в сценариях. Вместо нее лучше использовать операторы проверки файлов.

dd

Эта немного непонятная и "страшная" команда ("data duplicator") изначально использовалась для переноса данных на магнитной ленте между микрокомпьютерами с ОС UNIX и майнфреймами IBM. Команда dd просто создает копию файла (или stdin/stdout), выполняя по пути некоторые преобразования. Один из вариантов: преобразование из ASCII в EBCDIC[ 36 ], dd --help выведет список возможных вариантов преобразований и опций этой мощной утилиты.

# Изучаем 'dd'.

n=3

p=5

input_file=project.txt

output_file=log.txt

dd if=$input_file of=$output_file bs=1 skip=$((n-1)) count=$((p-n+1)) 2> /dev/null

# Извлечет из $input_file символы с n-го по p-й.

echo -n "hello world" | dd cbs=1 conv=unblock 2> /dev/null

# Выведет "hello world" вертикально.

# Спасибо, S.C.

Для демонстрации возможностей dd, попробуем перехватить нажатия на клавиши.

Оглавление книги


Генерация: 1.586. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз