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

на главную - закладки

Жанры

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

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

Шрифт:

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 # Удалить ведущий ноль

{

val=${1#0} # иначе Bash будет считать числа

return $val # восьмеричными (POSIX.2, sect 2.9.2.1).

}

day_index # Формула Гаусса:

{ # Количество дней от 3 Янв. 1600 до заданной даты.

day=$1

month=$2

year=$3

let "month = $month - 2"

if [ "$month" -le 0 ]

then

let "month += 12"

let "year -= 1"

fi

let "year -= $REFYR"

let "indexyr = $year / $CENTURY"

Поделиться:
Популярные книги

Не грози Дубровскому!

Панарин Антон
1. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому!

Я – Стрела. Трилогия

Суббота Светлана
Я - Стрела
Любовные романы:
любовно-фантастические романы
эро литература
6.82
рейтинг книги
Я – Стрела. Трилогия

Кодекс Охотника. Книга ХХ

Винокуров Юрий
20. Кодекс Охотника
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга ХХ

Путь Шедара

Кораблев Родион
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
Путь Шедара

Романов. Том 1 и Том 2

Кощеев Владимир
1. Романов
Фантастика:
фэнтези
попаданцы
альтернативная история
5.25
рейтинг книги
Романов. Том 1 и Том 2

Найди меня Шерхан

Тоцка Тала
3. Ямпольские-Демидовы
Любовные романы:
современные любовные романы
короткие любовные романы
7.70
рейтинг книги
Найди меня Шерхан

Вечный. Книга I

Рокотов Алексей
1. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга I

Дракон - не подарок

Суббота Светлана
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Дракон - не подарок

Барон не играет по правилам

Ренгач Евгений
1. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон не играет по правилам

Я – Орк. Том 2

Лисицин Евгений
2. Я — Орк
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я – Орк. Том 2

Мимик нового Мира 10

Северный Лис
9. Мимик!
Фантастика:
юмористическое фэнтези
альтернативная история
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 10

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Кровь и Пламя

Михайлов Дем Алексеевич
7. Изгой
Фантастика:
фэнтези
8.95
рейтинг книги
Кровь и Пламя

Законы Рода. Том 5

Flow Ascold
5. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 5