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

ЖАНРЫ

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

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

Шрифт:

# 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

# При первом вызове (с непустым аргументом s1)

# выводит первую лексему на stdout.

# Функция запоминает свое положение в строке s1 от вызова к вызову,

# так что последующие вызовы должны производиться с пустым первым аргументом,

# чтобы продолжить выделение лексем из строки s1.

# После вывода последней лексемы, все последующие вызовы будут выводить на stdout

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

#:end docstring:

###;;;autoload

function strtok

{

:

}

#:docstring strtrunc:

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

#

# Используется многими функциями, такими как strncmp, чтобы отсечь "лишние" символы.

# Выводит первые n символов в каждой из строк s1 s2 ... на stdout.

#:end docstring:

###;;;autoload

function strtrunc

{

n=$1 ; shift

for z; do

echo "${z:0:$n}"

done

}

# provide string

# string.bash

конец библиотеки

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

# ==> Все, что находится ниже, добавлено автором документа.

# ==> Чтобы этот сценарий можно было использовать как "библиотеку", необходимо

# ==> удалить все, что находится ниже и "source" этот файл в вашем сценарии.

# strcat

string0=one

string1=two

echo

echo "Проверка функции \"strcat\" :"

echo "Изначально \"string0\" = $string0"

echo "\"string1\" = $string1"

strcat string0 string1

echo "Теперь \"string0\" = $string0"

echo

# strlen

echo

echo "Проверка функции \"strlen\" :"

str=123456789

echo "\"str\" = $str"

echo -n "Длина строки \"str\" = "

strlen str

echo

# Упражнение:

# ---------

# Добавьте проверку остальных функций.

exit 0

Michael Zick предоставил очень сложный пример работы с массивами и утилитой md5sum, используемой для кодирования сведений о каталоге.

От переводчика:

К своему стыду вынужден признаться, что перевод комментариев оказался мне не "по зубам", поэтому оставляю этот сценарий без перевода.

Пример A-21. Directory information

#! /bin/bash

# directory-info.sh

# Parses and lists directory information.

# NOTE: Change lines 273 and 353 per "README" file.

# Michael Zick is the author of this script.

# Used here with his permission.

# Controls

# If overridden by command arguments, they must be in the order:

# Arg1: "Descriptor Directory"

# Arg2: "Exclude Paths"

# Arg3: "Exclude Directories"

#

# Environment Settings override Defaults.

# Command arguments override Environment Settings.

# Default location for content addressed file descriptors.

MD5UCFS=${1:-${MD5UCFS:-'/tmpfs/ucfs'}}

# Directory paths never to list or enter

declare -a \

EXCLUDE_PATHS=${2:-${EXCLUDE_PATHS:-'(/proc /dev /devfs /tmpfs)'}}

# Directories never to list or enter

declare -a \

EXCLUDE_DIRS=${3:-${EXCLUDE_DIRS:-'(ucfs lost+found tmp wtmp)'}}

# Files never to list or enter

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