Чтение онлайн

ЖАНРЫ

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

Купер Мендель

Шрифт:

done # 1 2 3 4 5 ... 80

# Пример использования вывода команды для генерации

# [списка] аргументов цикла "for".

echo; echo

COUNT=80 # Да, 'seq' допускает указание переменных в качестве параметра.

for a in `seq $COUNT` # или так: for a in $( seq $COUNT )

do

echo -n "$a "

done # 1 2 3 4 5 ... 80

echo; echo

BEGIN=75

END=80

for a in `seq $BEGIN $END`

#

Если "seq" передаются два аргумента, то первый означает начальное число последовательности,

#+ второй -- последнее,

do

echo -n "$a "

done # 75 76 77 78 79 80

echo; echo

BEGIN=45

INTERVAL=5

END=80

for a in `seq $BEGIN $INTERVAL $END`

# Если "seq" передется три аргумента, то первый аргумент -- начальное число в последовательности,

#+ второй -- шаг последовательности,

#+ и третий -- последнее число в последовательности.

do

echo -n "$a "

done # 45 50 55 60 65 70 75 80

echo; echo

exit 0

getopt

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

Пример 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, разделенных символами перевода строки. Исполнение команды можно прервать комбинацией клавиш controlc. Команду yes можно заставить выводить иную последовательность символов. Теперь самое время задаться вопросом о практической пользе этой команды. Основное применение этой команды состоит в том, что вывод от нее может быть передан, через конвейер, другой команде, ожидающей реакции пользователя. В результате получается, своего рода, слабенькая версия команды expect.

33

Фактически -- это сценарий, заимствованный из дистрибутива Debian Linux.

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 или bash lp <file1.txt

34

Очередь печати -- это группа заданий "ожидающих вывода" на принтер.

Поделиться с друзьями: