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

ЖАНРЫ

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

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

Шрифт:

# из ~ftp/pub/R3/fixes и поместит их в каталог ~/fixes.

# Очевидно, что последовательность ключей и аргументов очень важна, поскольку

# она определяет последовательность операций, выполняемых с удаленным ftp-сервером

#

# Mark Moraes (moraes@csri.toronto.edu), Feb 1, 1989

#

# ==> Эти комментарии добавлены автором документа.

# PATH=/local/bin:/usr/ucb:/usr/bin:/bin

# export PATH

# ==> Первые две строки в оригинальном

сценарии вероятно излишни.

TMPFILE=/tmp/ftp.$$

# ==> Создан временный файл

SITE=`domainname`.toronto.edu

# ==> 'domainname' подобен 'hostname'

usage="Порядок использования: $0 [-h удаленный_сервер] [-d удаленный_каталог]... [-f удаленный_файл:локальный_файл]... \

[-c локальный_каталог] [-m шаблон_имен_файлов] [-v]"

ftpflags="-i -n"

verbflag=

set -f # разрешить подстановку имен файлов (globbing) для опции -m

set x `getopt vh:d:c:m:f: $*`

if [ $? != 0 ]; then

echo $usage

exit 65

fi

shift

trap 'rm -f ${TMPFILE} ; exit' 0 1 2 3 15

echo "user anonymous ${USER-gnu}@${SITE} > ${TMPFILE}"

# ==> Добавлены кавычки (рекомендуется).

echo binary >> ${TMPFILE}

for i in $* # ==> Разбор командной строки.

do

case $i in

– v) verbflag=-v; echo hash >> ${TMPFILE}; shift;;

– h) remhost=$2; shift 2;;

– d) echo cd $2 >> ${TMPFILE};

if [ x${verbflag} != x ]; then

echo pwd >> ${TMPFILE};

fi;

shift 2;;

– c) echo lcd $2 >> ${TMPFILE}; shift 2;;

– m) echo mget "$2" >> ${TMPFILE}; shift 2;;

– f) f1=`expr "$2" : "\([^:]*\).*"`; f2=`expr "$2" : "[^:]*:\(.*\)"`;

echo get ${f1} ${f2} >> ${TMPFILE}; shift 2;;

– -) shift; break;;

esac

done

if [ $# -ne 0 ]; then

echo $usage

exit 65 # ==> В оригинале было "exit 2", изменено в соответствии со стандартами.

fi

if [ x${verbflag} != x ]; then

ftpflags="${ftpflags} -v"

fi

if [ x${remhost} = x ]; then

remhost=prep.ai.mit.edu

# ==> Здесь можете указать свой ftp-сервер по-умолчанию.

fi

echo quit >> ${TMPFILE}

# ==> Все команды сохранены во временном файле.

ftp ${ftpflags} ${remhost} < ${TMPFILE}

# ==> Теперь обработать пакетный файл.

rm -f ${TMPFILE}

# ==> В заключение, удалить временный файл (можно скопировать его в системный журнал).

# ==> Упражнения:

# ==> ----------

# ==> 1) Добавьте обработку ошибок.

# ==> 2) Добавьте уведомление звуковым сигналом.

Пример A-15. Указание на авторские права

Следующее

соглащение об авторских правах относится к двум, включенным в книгу,

сценариям от Mark Moraes: "behead.sh" и "ftpget.sh"

/*

* Copyright University of Toronto 1988, 1989.

* Автор: Mark Moraes

*

* Автор дает право на использование этого программного обеспечения

* его изменение и рапространение со следующими ограничениями:

*

* 1. Автор и Университет Торонто не отвечают

* за последствия использования этого программного обеспечения,

* какими ужасными бы они ни были,

* даже если они вызваны ошибками в нем.

*

* 2. Указание на происхождение программного обеспечения не должно подвергаться изменениям,

* явно или по оплошности. Так как некоторые пользователи обращаются к исходным текстам,

* они обязательно должны быть включены в документацию.

*

* 3. Измененная версия должна содержать явное упоминание об этом и не должна

* выдаваться за оригинал. Так как некоторые пользователи обращаются к исходным текстам,

* они обязательно должны быть включены в документацию.

*

* 4. Это соглашение не может удаляться и/или изменяться.

*/

+

Antek Sawicki предоставил следующий сценарий, который демонстрирует операцию подстановки параметров, обсуждавшуюся в Section 9.3.

Пример A-16. password: Генератор случайного 8-ми символьного пароля

#!/bin/bash

# Для старых систем может потребоваться указать #!/bin/bash2.

#

# Генератор случайных паролей для bash 2.x

# Автор: Antek Sawicki <tenox@tenox.tc>,

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

#

# ==> Комментарии, добавленные автором документа ==>

MATRIX="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"

LENGTH="8"

# ==> 'LENGTH' можно увеличить, для генерации более длинных паролей.

while [ "${n:=1}" -le "$LENGTH" ]

# ==> Напоминаю, что ":=" -- это оператор "подстановки значения по-умолчанию".

# ==> Таким образом, если 'n' не инициализирована, то в нее заносится 1.

do

PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}"

# ==> Хитро, хитро....

# ==> Начнем с самых внутренних скобок...

# ==> ${#MATRIX} -- возвращает длину массива MATRIX.

# ==> $RANDOM%${#MATRIX} -- возвращает случайное число

# ==> в диапазоне 1 .. ДЛИНА_МАССИВА(MATRIX) - 1.

# ==> ${MATRIX:$(($RANDOM%${#MATRIX})):1}

# ==> возвращает символ из MATRIX, из случайной позиции (найденной выше).

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