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

на главную - закладки

Жанры

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

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

Шрифт:

Пример 33-12. Передача массива в функцию и возврат массива из функции

#!/bin/bash

# array-function.sh: Передача массива в функцию и...

# "возврат" массива из функции

Pass_Array

{

local passed_array # Локальная переменная.

passed_array=( `echo "$1"` )

echo "${passed_array[@]}"

# Список всех элементов в новом массиве,

#+ объявленном и инициализированном в функции.

}

original_array=( element1 element2 element3 element4 element5 )

echo

echo "original_array = ${original_array[@]}"

#

Список всех элементов исходного массива.

# Так можно отдать массив в функцию.

# **********************************

argument=`echo ${original_array[@]}`

# **********************************

# Поместив все элементы массива в переменную,

#+ разделяя их пробелами.

#

# Обратите внимание: метод прямой передачи массива в функцию не сработает.

# Так можно получить массив из функции.

# *****************************************

returned_array=( `Pass_Array "$argument"` )

# *****************************************

# Записать результат в переменную-массив.

echo "returned_array = ${returned_array[@]}"

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

# А теперь попробуйте получить доступ к локальному массиву

#+ за пределами функции.

Pass_Array "$argument"

# Функция выведет массив, но...

#+ доступ к локальному массиву, за пределами функции, окажется невозможен.

echo "Результирующий массив (внутри функции) = ${passed_array[@]}"

# "ПУСТОЕ" ЗНАЧЕНИЕ, поскольку это локальная переменная.

echo

exit 0

Более сложный пример передачи массивов в функции, вы найдете в Пример A-11.

Использование конструкций с двойными круглыми скобками позволяет применять C-подобный синтаксис операций присвоения и инкремента переменных, а также оформления циклов for и while. См. Пример 10-12 и Пример 10-17.

Иногда очень удобно "пропускать" данные через один и тот же фильтр, но с разными параметрами, используя конвейерную обработку. Особенно это относится к tr и grep.

# Из примера "wstrings.sh".

wlist=`strings "$1" | tr A-Z a-z | tr '[:space:]' Z | \

tr -cs '[:alpha:]' Z | tr -s '\173-\377' Z | tr Z ' '`

Пример 33-13. Игры с анаграммами

#!/bin/bash

# agram.sh: Игры с анаграммами.

# Поиск анаграмм...

LETTERSET=etaoinshrdlu

anagram "$LETTERSET" | # Найти все анаграммы в наборе символов...

grep '.......' | # состоящие, как минимум из 7 символов,

grep '^is' | # начинающиеся с 'is'

grep -v 's$' | #

исключая множественное число

grep -v 'ed$' # и глаголы в прошедшем времени

# Здесь используется утилита "anagram"

#+ которая входит в состав пакета "yawl" , разработанного автором.

# http://ibiblio.org/pub/Linux/libs/yawl-0.2.tar.gz

exit 0 # Конец.

bash$ sh agram.sh

islander

isolate

isolead

isotheral

См. также Пример 27-2, Пример 12-18 и Пример A-10.

Для создания блочных комментариев можно использовать "анонимные встроенные документы". См. Пример 17-10.

Попытка вызова утилиты из сценария на машине, где эта утилита отсутствует, потенциально опасна. Для обхода подобных проблем можно воспользоваться утилитой whatis.

CMD=command1 # Основной вариант.

PlanB=command2 # Запасной вариант.

command_test=$(whatis "$CMD" | grep 'nothing appropriate')

# Если 'command1' не найдена в системе, то 'whatis' вернет

#+ "command1: nothing appropriate."

#==> От переводчика: Будьте внимательны! Если у вас локализованная версия whatis

#==> то вывод от нее может отличаться от используемого здесь ('nothing appropriate')

if [[ -z "$command_test" ]] # Проверка наличия утилиты в системе.

then

$CMD option1 option2 # Запуск команды с параметрами.

else # Иначе,

$PlanB #+ запустить command2 (запасной вариант).

fi

Команда run-parts удобна для запуска нескольких сценариев, особенно в комбинации с cron или at.

Было бы неплохо снабдить сценарий графическим интерфейстом X-Window. Для этого можно порекомендовать пакеты Xscript, Xmenu и widtools. Правда, первые два, кажется больше не поддерживаются разработчиками. Зато widtools можно получить здесь.

Пакет widtools (widget tools) требует наличия библиотеки XForms. Кроме того, необходимо слегка подправить Makefile, чтобы этот пакет можно было собрать на типичной Linux-системе. Но хуже всего то, что три из шести виджетов не работают :-(( (segfault).

Для постороения приложений с графическим интерфейсом, можно попробовать Tk, или wish (надстройка над Tcl), PerlTk (Perl с поддержкой Tk), tksh (ksh с поддержкой Tk), XForms4Perl (Perl с поддержкой XForms), Gtk-Perl (Perl с поддержкой Gtk) или PyQt (Python с поддержкой Qt).

Поделиться:
Популярные книги

Заход. Солнцев. Книга XII

Скабер Артемий
12. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Заход. Солнцев. Книга XII

Случайная свадьба (+ Бонус)

Тоцка Тала
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Случайная свадьба (+ Бонус)

Приручитель женщин-монстров. Том 3

Дорничев Дмитрий
3. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 3

Ищу жену для своего мужа

Кат Зозо
Любовные романы:
любовно-фантастические романы
6.17
рейтинг книги
Ищу жену для своего мужа

Сердце Дракона. Том 19. Часть 1

Клеванский Кирилл Сергеевич
19. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.52
рейтинг книги
Сердце Дракона. Том 19. Часть 1

Пустоцвет

Зика Натаэль
Любовные романы:
современные любовные романы
7.73
рейтинг книги
Пустоцвет

Жребий некроманта. Надежда рода

Решетов Евгений Валерьевич
1. Жребий некроманта
Фантастика:
фэнтези
попаданцы
6.50
рейтинг книги
Жребий некроманта. Надежда рода

Возвышение Меркурия. Книга 4

Кронос Александр
4. Меркурий
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Возвышение Меркурия. Книга 4

Бездомыш. Предземье

Рымин Андрей Олегович
3. К Вершине
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Бездомыш. Предземье

Столичный доктор. Том II

Вязовский Алексей
2. Столичный доктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Столичный доктор. Том II

Последний из рода Демидовых

Ветров Борис
Фантастика:
детективная фантастика
попаданцы
аниме
5.00
рейтинг книги
Последний из рода Демидовых

Камень. Книга восьмая

Минин Станислав
8. Камень
Фантастика:
фэнтези
боевая фантастика
7.00
рейтинг книги
Камень. Книга восьмая

Измена. Не прощу

Леманн Анастасия
1. Измены
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Измена. Не прощу

Измена. Верну тебя, жена

Дали Мила
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Верну тебя, жена