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

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

numdirs=0

zz=0

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

do

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

done

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

exit 0

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

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

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

#!/bin/bash

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

# Автор: Noah Friedman <friedman@prep.ai.mit.edu>

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

# Дата создания: 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

#

#:end docstring:

###;;;autoload

function strncat ()

{

local s1="$1"

local s2="$2"

local -i n="$3"

local s1_val s2_val

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

s2_val=${!s2}

if [ ${#s2_val} -gt ${n} ]; then

s2_val=${s2_vaclass="underline" 0:$n} # ==> выделение подстроки

fi

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

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

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

}

#:docstring strcmp:

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

#

# Strcmp сравнивает две строки и возвращает число меньше, равно

# или больше нуля, в зависимости от результатов сравнения.

#:end docstring:

###;;;autoload

function strcmp ()

{

[ "$1" = "$2" ] && return 0

[ "${1}" '<' "${2}" ] > /dev/null && return -1

return 1

}

#:docstring strncmp:

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

#

# Подобна strcmp, но сравнивает не более n символов

#:end docstring:

###;;;autoload

function strncmp ()

{

if [ -z "${3}" -o "${3}" -le "0" ]; then

return 0

fi

if [ ${3} -ge ${#1} -a ${3} -ge ${#2} ]; then

strcmp "$1" "$2"

return $?

else

s1=${1:0:$3}

s2=${2:0:$3}

strcmp $s1 $s2

return $?

fi

}

#:docstring strlen:

# Порядок использования: strlen s

#

# возвращает количество символов в строке s.

#:end docstring:

###;;;autoload

function strlen ()

{

eval echo "\${#${1}}"

# ==> Возвращает длину переменной,

# ==> чье имя передается как аргумент.

}

#:docstring strspn:

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

#

# Strspn возвращает максимальную длину сегмента в строке s1,

# который полностью состоит из символов строки s2.

#:end docstring:

###;;;autoload

function strspn ()

{

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

local IFS=

local result="${1%%[!${2}]*}"

echo ${#result}

}

#:docstring strcspn:

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

#

# Strcspn возвращает максимальную длину сегмента в строке s1,

# который полностью не содержит символы из строки s2.

#:end docstring:

###;;;autoload

function strcspn ()

{

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

local IFS=

local result="${1%%[${2}]*}"

echo ${#result}

}

#:docstring strstr:

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

#

# Strstr выводит подстроку первого вхождения строки s2

# в строке s1, или ничего не выводит, если подстрока s2 в строке s1 не найдена.

# Если s2 содержит строку нулевой длины, то strstr выводит строку s1.

#:end docstring:

###;;;autoload

function strstr ()

{

# Если s2 -- строка нулевой длины, то вывести строку s1

[ ${#2} -eq 0 ] && { echo "$1" ; return 0; }

# не выводить ничего, если s2 не найдена в s1

case "$1" in

*$2*) ;;

*) return 1;;

esac

# использовать шаблон, для удаления всех несоответствий после s2 в s1

first=${1/$2*/}

# Затем удалить все несоответствия с начала строки

echo "${1##$first}"

}

#:docstring strtok:

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

#

# Strtok рассматривает строку s1, как последовательность из 0, или более,

# лексем (токенов), разделенных символами строки s2