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

ЖАНРЫ

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

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

Шрифт:

avar=`echo ${array[@]}` # Преобразовать массив в строку.

display "$avar" # Вывести его.

echo; echo

echo "Поколение $generation -- живых особей $alive"

if [ "$alive" -eq 0 ]

then

echo

echo "Преждеверменное завершение: не осталось ни одной живой особи!"

exit $NONE_ALIVE # Нет смысла продолжать

fi #+ если не осталось ни одной живой особи

}

# =========================================================

# main

#

Загрузить начальное поколение из файла.

initial=( `cat "$startfile" | sed -e '/#/d' | tr -d '\n' |\

sed -e 's/\./\. /g' -e 's/_/_ /g'` )

# Удалить строки, начинающиеся с символа '#' -- комментарии.

# Удалить строки перевода строки и вставить пробелы между элементами.

clear # Очистка экрана.

echo # Заголовок

echo "======================="

echo " $GENERATIONS поколений"

echo " в"

echo " игре \" ЖИЗНЬ\""

echo "======================="

# -------- Вывести первое поколение.
– -------

Gen0=`echo ${initial[@]}`

display "$Gen0" # Тлько вывод.

echo; echo

echo "Поколение $generation -- живых особей $alive"

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

let "generation += 1" # Нарастить счетчик поколений.

echo

# ------- Вывести второе поколение.
– ------

Cur=`echo ${initial[@]}`

next_gen "$Cur" # Обновить и вывести.

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

let "generation += 1" # Нарастить счетчик поколений.

# ------ Основной цикл игры ------

while [ "$generation" -le "$GENERATIONS" ]

do

Cur="$avar"

next_gen "$Cur"

let "generation += 1"

done

# ==============================================================

echo

exit 0

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

# Этот сценарий имеет недоработку.

# Граничные ячейки сверху, снизу и сбоков остаются пустыми.

# Упражнение: Доработайте сценарий таким образом, чтобы ,

# + левая и правая стороны как бы "соприкасались",

# + так же и верхняя и нижняя стороны.

Пример A-12. Файл с первым поколением для игры "Жизнь"

# Это файл-пример, содержащий "поколение 0", для сценария "life.sh".

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

# Игровое поле имеет размер 10 x 10, точкой обозначается "живая" особь,

#+ символом подчеркивания -- пустая ячейка. Мы не можем использовать пробелы,

#+ для обозначения пустых ячеек, из-за особенностей

строения массивов в Bash.

# [Упражнение для читателей: объясните, почему?.]

#

# Строки, начинающиеся с символа '#' считаются комментариями, сценарий их игнорирует.

__.__..___

___._.____

____.___..

_._______.

____._____

..__...___

____._____

___...____

__.._..___

_..___..__

+++

Следующие два сценария предоставил Mark Moraes, из университета в Торонто. См. файл "Moraes-COPYRIGHT", который содержит указание на авторские права.

Пример A-13. behead: Удаление заголовков из электронных писем и новостей

#! /bin/sh

# Удаление заголовков из электронных писем и новостей т.е. до первой

# пустой строки

# Mark Moraes, Университет в Торонто

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

if [ $# -eq 0 ]; then

# ==> Если входной аргумент не задан (файл), то выводить результат на stdin.

sed -e '1,/^$/d' -e '/^[ ]*$/d'

# --> Удалить пустые строки и все строки предшествующие им

else

# ==> Если аргумент командной строки задан, то использовать его как имя файла.

for i do

sed -e '1,/^$/d' -e '/^[ ]*$/d' $i

# --> То же, что и выше.

done

fi

# ==> Упражнение: Добавьте проверку на наличие ошибок.

# ==>

# ==> Обратите внимание -- как похожи маленькие сценарии sed, за исключением передачи аргумента.

# ==> Можно ли его оформит в виде функции? Почему да или почему нет?

Пример A-14. ftpget: Скачивание файлов по ftp

#! /bin/sh

# $Id: ftpget,v 1.2 91/05/07 21:15:43 moraes Exp $

# Сценарий устанавливает анонимное соединение с ftp-сервером.

# Простой и быстрый - написан как дополнение к ftplist

# -h -- удаленный сервер (по-умолчанию prep.ai.mit.edu)

# -d -- каталог на сервере - вы можете указать последовательность из нескольких ключей -d

# Если вы используете относительные пути,

# будьте внимательны при задании последовательности.

# (по-умолчанию -- каталог пользователя ftp)

# -v -- "многословный" режим, будет показывать все ответы ftp-сервера

# -f -- file[:localfile] скачивает удаленный file и записывает под именем localfile

# -m -- шаблон для mget. Не забудьте взять в кавычки!

# -c -- локальный каталог

# Например,

# ftpget -h expo.lcs.mit.edu -d contrib -f xplaces.shar:xplaces.sh \

# -d ../pub/R3/fixes -c ~/fixes -m 'fix*'

# Эта команда загрузит файл xplaces.shar из ~ftp/contrib с expo.lcs.mit.edu

# и сохранит под именем xplaces.sh в текущем каталоге, затем заберет все исправления (fixes)

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