Выбрать главу

cd /

tar -czf - bin boot dev etc home info lib man root sbin share usr var >/pipe

# ==> Именованный канал /pipe, используется для передачи данных между процессами:

# ==> 'tar/gzip' пишет в /pipe, а 'ssh' -- читает из /pipe.

# ==> В результате будет получена резервная копия всех основных каталогов.

# ==> В чем состоит преимущество именованного канала, в данной ситуации,

# ==> перед неименованным каналом "|" ?

# ==> Будет ли работать неименованный канал в данной ситуации?

exit 0

+

Stephane Chazelas предоставил следующий сценарий, который демонстрирует возможность генерации простых чисел без использования массивов.

Пример A-18. Генерация простых чисел, с использованием оператора деления по модулю (остаток от деления)

#!/bin/bash

# primes.sh: Генерация простых чисел, без использования массивов.

# Автор: Stephane Chazelas.

# Этот сценарий не использует класический алгоритм "Решето Эратосфена",

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

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

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.

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

#!/bin/sh

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

# emaiclass="underline" mikaku@fiwix.org

#

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

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

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

# emaiclass="underline" beth13@mail.utexas.edu

#

# 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 # ==> Признак завершения поиска.