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

на главную

Жанры

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

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

Шрифт:

# Оператор \> выполняет сравнение ASCII-строк

#+ внутри одиночных квадратных скобок.

# if [[ ${Countries[$index]} > ${Countries[`expr $index + 1`]} ]]

#+ дает тот же результат.

then

exchange $index `expr $index + 1` # Поменять местами.

fi

let "index += 1"

done # Конец внутреннего цикла

let "comparisons -= 1" # Поскольку самый "тяжелый" элемент уже "опустился" на дно,

#+ то на каждом последующем проходе нужно выполнять на одно

сравнение меньше.

echo

echo "$count: ${Countries[@]}" # Вывести содержимое массива после каждого прохода.

echo

let "count += 1" # Увеличить счетчик проходов.

done # Конец внешнего цикла

exit 0

– -

Можно ли вложить один массив в другой?

#!/bin/bash

# Вложенный массив.

# Автор: Michael Zick.

AnArray=( $(ls --inode --ignore-backups --almost-all \

– -directory --full-time --color=none --time=status \

– -sort=time -l ${PWD} ) ) # Команды и опции.

# Пробелы важны . . .

SubArray=( ${AnArray[@]:11:1} ${AnArray[@]:6:5} )

# Массив имеет два элемента, каждый из которых, в свою очередь, является массивом.

echo "Текущий каталог и дата последнего изменения:"

echo "${SubArray[@]}"

exit 0

– -

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

Пример 25-7. Вложенные массивы и косвенные ссылки

#!/bin/bash

# embedded-arrays.sh

# Вложенные массивы и косвенные ссылки.

# Автор: Dennis Leeuw.

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

# Дополнен автором документа.

ARRAY1=(

VAR1_1=value11

VAR1_2=value12

VAR1_3=value13

)

ARRAY2=(

VARIABLE="test"

STRING="VAR1=value1 VAR2=value2 VAR3=value3"

ARRAY21=${ARRAY1[*]}

) # Вложение массива ARRAY1 в массив ARRAY2.

function print {

OLD_IFS="$IFS"

IFS=$'\n' # Вывод каждого элемента массива

#+ в отдельной строке.

TEST1="ARRAY2[*]"

local ${!TEST1} # Посмотрите, что произойдет, если убрать эту строку.

# Косвенная ссылка.

# Позволяет получить доступ к компонентам $TEST1

#+ в этой функции.

# Посмотрим, что получилось.

echo

echo "\$TEST1 = $TEST1" # Просто имя переменной.

echo; echo

echo "{\$TEST1} = ${!TEST1}" # Вывод на экран содержимого переменной.

# Это то, что дает

#+ косвенная ссылка.

echo

echo "-------------------------------------------"; echo

echo

#

Вывод переменной

echo "Переменная VARIABLE: $VARIABLE"

# Вывод элементов строки

IFS="$OLD_IFS"

TEST2="STRING[*]"

local ${!TEST2} # Косвенная ссылка (то же, что и выше).

echo "Элемент VAR2: $VAR2 из строки STRING"

# Вывод элемента массива

TEST2="ARRAY21[*]"

local ${!TEST2} # Косвенная ссылка.

echo "Элемент VAR1_1: $VAR1_1 из массива ARRAY21"

}

print

echo

exit 0

– -

С помощью массивов, на языке командной оболочки, вполне возможно реализовать алгоритм Решета Эратосфена. Конечно же -- это очень ресурсоемкая задача. В виде сценария она будет работать мучительно долго, так что лучше всего реализовать ее на каком либо другом, компилирующем, языке программирования, таком как C.

Пример 25-8. Пример реализации алгоритма Решето Эратосфена

#!/bin/bash

# sieve.sh

# Решето Эратосфена

# Очень старый алгоритм поиска простых чисел.

# Этот сценарий выполняется во много раз медленнее

# чем аналогичная программа на C.

LOWER_LIMIT=1 # Начиная с 1.

UPPER_LIMIT=1000 # До 1000.

# (Вы можете установить верхний предел и выше... если вам есть чем себя занять.)

PRIME=1

NON_PRIME=0

declare -a Primes

# Primes[] -- массив.

initialize

{

# Инициализация массива.

i=$LOWER_LIMIT

until [ "$i" -gt "$UPPER_LIMIT" ]

do

Primes[i]=$PRIME

let "i += 1"

done

# Все числа в заданном диапазоне считать простыми,

# пока не доказано обратное.

}

print_primes

{

# Вывод индексов элементов массива Primes[], которые признаны простыми.

i=$LOWER_LIMIT

until [ "$i" -gt "$UPPER_LIMIT" ]

do

if [ "${Primes[i]}" -eq "$PRIME" ]

then

printf "%8d" $i

# 8 пробелов перед числом придают удобочитаемый табличный вывод на экран.

fi

let "i += 1"

done

}

sift # Отсеивание составных чисел.

{

let i=$LOWER_LIMIT+1

# Нам известно, что 1 -- это простое число, поэтому начнем с 2.

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

Фиктивная жена

Шагаева Наталья
1. Братья Вертинские
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Фиктивная жена

Дурная жена неверного дракона

Ганова Алиса
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Дурная жена неверного дракона

Последний Паладин. Том 5

Саваровский Роман
5. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 5

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

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

Мастер 3

Чащин Валерий
3. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер 3

Лорд Системы 8

Токсик Саша
8. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 8

Идеальный мир для Лекаря 12

Сапфир Олег
12. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 12

Убивать чтобы жить 5

Бор Жорж
5. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 5

Первый среди равных. Книга III

Бор Жорж
3. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
6.00
рейтинг книги
Первый среди равных. Книга III

Академия

Кондакова Анна
2. Клан Волка
Фантастика:
боевая фантастика
5.40
рейтинг книги
Академия

Господин военлёт

Дроздов Анатолий Федорович
Фантастика:
альтернативная история
9.25
рейтинг книги
Господин военлёт

Мастер Разума IV

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

Последний попаданец 8

Зубов Константин
8. Последний попаданец
Фантастика:
юмористическая фантастика
рпг
5.00
рейтинг книги
Последний попаданец 8

Тройняшки не по плану. Идеальный генофонд

Лесневская Вероника
Роковые подмены
Любовные романы:
современные любовные романы
6.80
рейтинг книги
Тройняшки не по плану. Идеальный генофонд