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

#+ путем поиска делителей, с помощью оператора нахождения остатка от деления "%".

LIMIT=1000 # Простые от 2 до 1000

Primes()

{

(( n = $1 + 1 )) # Перейти к следующему числу.

shift # Следующий параметр в списке.

# echo "_n=$n i=$i_"

if (( n == LIMIT ))

then echo $*

return

fi

for i; do # "i" устанавливается в "@", предыдущее значение $n.

# echo "-n=$n i=$i-"

(( i * i > n )) && break # Оптимизация.

(( n % i )) && continue # Отсечь составное число с помощью оператора "%".

Primes $n $@ # Рекурсивный вызов внутри цикла.

return

done

Primes $n $@ $n # Рекурсивный вызов за пределами цикла.

# Последовательное накопление позиционных параметров.

# в "$@" накапливаются простые числа.

}

Primes 1

exit 0

# Раскомментарьте строки 16 и 24, это поможет понять суть происходящего.

# Сравните скоростные характеристики этого сценария и сценария (ex68.sh),

# реализующего алгоритм "Решето Эратосфена".

# Упражнение: Попробуйте реализовать этот сценарий без использования рекурсии.

# Это даст некоторый выигрыш в скорости.

+

Jordi Sanfeliu дал согласие на публикацию своего сценария tree.

<p><strong>Пример A-19. tree: Вывод дерева каталогов</strong></p>

#!/bin/sh

# @(#) tree 1.1 30/11/95 by Jordi Sanfeliu

# email: [email protected]

#

# Начальная версия: 1.0 30/11/95

# Следующая версия: 1.1 24/02/97 Now, with symbolic links

# Исправления : Ian Kjos, поддержка недоступных каталогов

# email: [email protected]

#

# Tree -- средство просмотра дерева каталогов (очевидно :-) )

#

# ==> Используется в данном документе с разрешения автора сценария, Jordi Sanfeliu.

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

# ==> Добавлено "окавычивание" аргументов.

search () {

for dir in `echo *`

# ==> `echo *` список всех файлов в текущем каталоге, без символов перевода строки.

# ==> Тот же эффект дает for dir in *

# ==> но "dir in `echo *`" не обрабатывет файлы, чьи имена содержат пробелы.

do

if [ -d "$dir" ] ; then # ==> Если это каталог (-d)...

zz=0 # ==> Временная переменная, для сохранения уровня вложенности каталога.

while [ $zz != $deep ] # Keep track of inner nested loop.

do

echo -n "| " # ==> Показать символ вертикальной связи,

# ==> с 2 пробелами и без перевода строки.

zz=`expr $zz + 1` # ==> Нарастить zz.

done

if [ -L "$dir" ] ; then # ==> Если символическая ссылка на каталог...

echo "+---$dir" `ls -l $dir | sed 's/^.*'$dir' //'`

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

# ==> без указания даты/времени.

else

echo "+---$dir" # ==> Вывести горизонтальный соединитель...

# ==> и название каталога.

if cd "$dir" ; then # ==> Если можно войти в каталог...

deep=`expr $deep + 1` # ==> Нарастить уровень вложенности.

search # рекурсия ;-)

numdirs=`expr $numdirs + 1` # ==> Нарастить счетчик каталогов.

fi

fi

fi

done

cd .. # ==> Подняться на один уровень вверх.

if [ "$deep" ] ; then # ==> Если depth = 0 (возвращает TRUE)...

swfi=1 # ==> выставить признак окончания поиска.

fi

deep=`expr $deep - 1` # ==> Уменьшить уровень вложенности.

}

# - Main -

if [ $# = 0 ] ; then

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

else

cd $1 # ==> иначе перейти в заданный каталог.

fi

echo "Начальный каталог = `pwd`"

swfi=0 # ==> Признак завершения поиска.

deep=0 # ==> Уровень вложенности.

numdirs=0

zz=0

while [ "$swfi" != 1 ] # Пока поиск не закончен...

do

search # ==> Вызвать функцию поиска.

done

echo "Всего каталогов = $numdirs"

exit 0

# ==> Попробуйте разобраться в том как этот сценарий работает.

Noah Friedman дал разрешение на публикацию своей библиотеки функций для работы со строками, которая, по сути, воспроизводит некоторые библиотечные функции языка C.

<p><strong>Пример A-20. Функции для работы со строками</strong></p>

#!/bin/bash

# string.bash --- эмуляция библиотеки функций string(3)

# Автор: Noah Friedman

# ==> Используется с его разрешения.

# Дата создания: 1992-07-01

# Дата последней модификации: 1993-09-29

# Public domain

# Преобразование в синтаксис bash v2 выполнил Chet Ramey

# Комментарий:

# Код:

#:docstring strcat:

# Порядок использования: strcat s1 s2

#

# Strcat добавляет содержимое переменной s2 к переменной s1.

#

# Пример:

# a="foo"

# b="bar"

# strcat a b

# echo $a

# => foobar

#

#:end docstring:

###;;;autoload

function strcat ()

{

local s1_val s2_val

s1_val=${!1} # косвенная ссылка

s2_val=${!2}

eval "$1"=\'"${s1_val}${s2_val}"\'

# ==> eval $1='${s1_val}${s2_val}' во избежание проблем,

# ==> если одна из переменных содержит одиночную кавычку.

}

#:docstring strncat:

# Порядок использования: strncat s1 s2 $n

#

# Аналог strcat, но добавляет не более n символов из

# переменной s2. Результат выводится на stdout.

#

# Пример:

# a=foo

# b=barbaz

# strncat a b 3

# echo $a

# => foobar

#

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных