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

ЖАНРЫ

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

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

Шрифт:

user $Username $Password

binary

bell

cd $Directory

put $Filename

bye

End-Of-Session

# ключ -n, команды "ftp", запрещает автоматический вход.

# "bell" -- звонок (звуковой сигнал) после передачи каждого файла.

exit 0

Пример A-6. copy-cd: Копирование компакт-дисков с данными

#!/bin/bash

# copy-cd.sh: copying a data CD

CDROM=/dev/cdrom # устройство CD ROM

OF=/home/bozo/projects/cdimage.iso #

промежуточный файл

# /xxxx/xxxxxxx/ измените для своей системы.

BLOCKSIZE=2048

SPEED=2 # Можно задать более высокую скорость, если поддерживается.

echo; echo "Вставьте исходный CD, но *НЕ* монтируйте его."

echo "Нажмите ENTER, когда будете готовы. "

read ready # Ожидание.

echo; echo "Создается промежуточный файл $OF."

echo "Это может занять какое-то время. Пожалуйста подождите."

dd if=$CDROM of=$OF bs=$BLOCKSIZE # Копирование.

echo; echo "Выньте исходный CD."

echo "Вставьте чистую болванку CDR."

echo "Нажмите ENTER, когда будете готовы. "

read ready # Ожидание.

echo "Копируется файл $OF на болванку."

cdrecord -v -isosize speed=$SPEED dev=0,0 $OF

# Используется пакет Joerg Schilling -- "cdrecord" .

# http://www.fokus.gmd.de/nthp/employees/schilling/cdrecord.html

echo; echo "Копирование завершено."

echo "Желаете удалить промежуточный файл (y/n)? " # Наверняка большой файл получился.

read answer

case "$answer" in

[yY]) rm -f $OF

echo "Файл $OF удален."

;;

*) echo "Файл $OF не был удален.";;

esac

echo

# Упражнение:

# Добавьте в оператор "case" возможность обработки, введенных пользователем, "yes" и "Yes".

exit 0

Пример A-7. Последовательности Коллаца (Collatz)

#!/bin/bash

# collatz.sh

# Широко известная последовательность Коллаца (Collatz) (гипотеза Коллаца).

# -------------------------------------------

# 1) Принимает из командной строки "начальное" целое число.

# 2) ЧИСЛО <--- НАЧАЛЬНОЕ ЗНАЧЕНИЕ

# 3) Вывести ЧИСЛО.

# 4) Если ЧИСЛО четное, разделить на 2,

# 5)+ Если не четное -- умножить на 3 и прибавить 1.

# 6) ЧИСЛО <--- РЕЗУЛЬТАТ

# 7) Повторить, начиная с п. 3, заданное число раз.

#

# Теоретически, такая последовательность должна сходиться,

#+ не зависимо от величины начального значения,

#+ к повторению циклов "4,2,1...",

#+ даже после значительных флуктуаций в самом начале.

MAX_ITERATIONS=200

#

Для больших начальных значений (>32000), это значение придется увеличить.

h=${1:-$$} # Начальное значение

# если из командной строки ничего не задано, то берется $PID,

echo

echo "C($h) --- $MAX_ITERATIONS итераций"

echo

for ((i=1; i<=MAX_ITERATIONS; i++))

do

echo -n "$h "

# ^^^^^

# табуляция

let "remainder = h % 2"

if [ "$remainder" -eq 0 ] # Четное?

then

let "h /= 2" # Разделить на 2.

else

let "h = h*3 + 1" # Умножить на 3 и прибавить 1.

fi

COLUMNS=10 # Выводить по 10 значений в строке.

let "line_break = i % $COLUMNS"

if [ "$line_break" -eq 0 ]

then

echo

fi

done

echo

exit 0

Пример A-8. days-between: Подсчет числа дней между двумя датами

#!/bin/bash

# days-between.sh: Подсчет числа дней между двумя датами.

# Порядок использования: ./days-between.sh [M]M/[D]D/YYYY [M]M/[D]D/YYYY

ARGS=2 # Ожидается два аргумента из командной строки.

E_PARAM_ERR=65 # Ошибка в числе ожидаемых аргументов.

REFYR=1600 # Начальный год.

CENTURY=100

DIY=365

ADJ_DIY=367 # Корректировка на високосный год + 1.

MIY=12

DIM=31

LEAPCYCLE=4

MAXRETVAL=255 # Максимально возможное возвращаемое значение

# для положительных чисел.

diff= # Количество дней между датами.

value= # Абсолютное значение.

day= # день, месяц, год.

month=

year=

Param_Error # Ошибка в пвраметрах командной строки.

{

echo "Порядок использования: `basename $0` [M]M/[D]D/YYYY [M]M/[D]D/YYYY"

echo " (даты должны быть после 1/3/1600)"

exit $E_PARAM_ERR

}

Parse_Date # Разбор даты.

{

month=${1%%/**}

dm=${1%/**} # День и месяц.

day=${dm#*/}

let "year = `basename $1`" # Хотя это и не имя файла, но результат тот же.

}

check_date # Проверка даты.

{

[ "$day" -gt "$DIM" ] || [ "$month" -gt "$MIY" ] || [ "$year" -lt "$REFYR" ] && Param_Error

# Выход из сценария при обнаружении ошибки.

# Используется комбинация "ИЛИ-списка / И-списка".

#

# Упражнение: Реализуйте более строгую проверку даты.

}

strip_leading_zero # Удалить ведущий ноль

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