Книга: Искусство программирования на языке сценариев командной оболочки
Пример 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 (будьте осторожны!).
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, попробуем перехватить нажатия на клавиши.
- Пример 12-39. Использование seq для генерации списка аргументов цикла for
- Пример 12-40. Использование getopt для разбора аргументов командной строки
- Пример 12-41. Захват нажатых клавиш
- Пример 12-42. Надежное удаление файла
- Пример 12-43. Генератор имен файлов
- Пример 12-44. Преобразование метров в мили
- Пример 12-45. Пример работы с m4
- Пример 12-39. Использование seq для генерации списка аргументов цикла for
- Пример установочного скрипта
- Инструмент командной строки gbak
- Пример из практики
- Восстановление с использованием инструмента gbak
- Инструмент командной строки gfix
- 2.1.3. Функция getopt_long()
- Типы страниц и их использование
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
- Использование констант
- Использование переменной окружения ISC_PATH
- Использование сервера Yaffil внутри процесса