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

ЖАНРЫ

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

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

Шрифт:

number=$RANDOM

echo -n "$number "

let "count += 1"

done

}

echo; echo

RANDOM=1 # Переустановка начального числа генератора случайных чисел RANDOM.

random_numbers

echo; echo

RANDOM=1 #

То же самое начальное число...

random_numbers # ...в результате получается та же последовательность чисел.

#

# В каких случаях может оказаться полезной генерация совпадающих серий?

echo; echo

RANDOM=2 # Еще одна попытка, но с другим начальным числом...

random_numbers # получим другую последовательность.

echo; echo

# RANDOM=$$ в качестве начального числа выбирается PID процесса-сценария.

# Вполне допустимо взять в качестве начального числа результат работы команд 'time' или 'date'.

# Немного воображения...

SEED=$(head -1 /dev/urandom | od -N 1 | awk '{ print $2 }')

# Псевдослучайное число забирается

#+ из системного генератора псевдослучайных чисел /dev/urandom ,

#+ затем конвертируется в восьмеричное число командой "od",

#+ и наконец "awk" возвращает единственное число для переменной SEED.

RANDOM=$SEED

random_numbers

echo; echo

exit 0

Системный генератор /dev/urandom дает последовательность псевдослучайных чисел с более равномерным распределением, чем $RANDOM. Команда dd if=/dev/urandom of=targetfile bs=1 count=XX создает файл, содержащий последовательность псевдослучайных чисел. Однако, эти числа требуют дополнительной обработки, например с помощью команды od (этот прием используется в примере выше) или dd (см. Пример 12-42).

Есть и другие способы генерации псевдослучайных последовательностей в сценариях. Awk имеет для этого достаточно удобные средства.

Пример 9-27. Получение псевдослучайных чисел с помощью awk

#!/bin/bash

# random2.sh: Генерация псевдослучайных чисел в диапазоне 0 - 1.

# Используется функция rand из awk.

AWKSCRIPT=' { srand; print rand } '

# Команды/параметры, передаваемые awk

# Обратите внимание, функция srand переустанавливает начальное число генератора случайных чисел.

echo -n "Случайное число в диапазоне от 0

до 1 = "

echo | awk "$AWKSCRIPT"

exit 0

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

# ---------

# 1) С помощью оператора цикла выведите 10 различных случайных чисел.

# (Подсказка: вам потребуется вызвать функцию "srand"

# в каждом цикле с разными начальными числами.

# Что произойдет, если этого не сделать?)

# 2) Заставьте сценарий генерировать случайные числа в диапазоне 10 - 100

# используя целочисленный множитель, как коэффициент масштабирования

# 3) То же самое, что и во втором упражнении,

# но на этот раз случайные числа должны быть целыми.

9.7. Двойные круглые скобки

Эта конструкция во многом похожа на инструкцию let, внутри ((...)) вычисляются арифметические выражения и возвращается их результат. В простейшем случае, конструкция a=$(( 5 + 3 )) присвоит переменной "a" значение выражения "5 + 3", или 8. Но, кроме того, двойные круглые скобки позволяют работать с переменными в стиле языка C.

Пример 9-28. Работа с переменными в стиле языка C

#!/bin/bash

# Работа с переменными в стиле языка C.

echo

(( a = 23 )) # Присвоение переменной в стиле C, с обоих строн от "=" стоят пробелы.

echo "a (начальное значение) = $a"

(( a++ )) # Пост-инкремент 'a', в стиле C.

echo "a (после a++) = $a"

(( a-- )) # Пост-декремент 'a', в стиле C.

echo "a (после a--) = $a"

(( ++a )) # Пред-инкремент 'a', в стиле C.

echo "a (после ++a) = $a"

(( --a )) # Пред-декремент 'a', в стиле C.

echo "a (после --a) = $a"

echo

(( t = a<45?7:11 )) # Трехместный оператор в стиле языка C.

echo "If a < 45, then t = 7, else t = 11."

echo "t = $t " # Да!

echo

# См. так же описание ((...)) в циклах "for" и "while".

# Эта конструкция доступна в Bash, начиная с версии 2.04.

exit 0

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