# Спасибо Stephane Chazelas.
Такой метод обращения к переменным имеет свои особенности. Если переменная, на которую делается ссылка, меняет свое значение, то переменная которая ссылается, должна быть должным образом разыменована, т.е. олжна быть выполнена операция получения ссылки, как это делается в примере выше. К счастью, нотация ${!variable}, введенная в Bash, начиная с версии 2 (см. Пример 34-2) позволяет выполнять косвенные ссылки более интуитивно понятным образом.
9.6. $RANDOM: генерация псевдослучайных целых чисел
$RANDOM -- внутренняя функция Bash (не константа), которая возвращает псевдослучайные целые числа в диапазоне 0 - 32767. Функция $RANDOM не должна использоваться для генераци ключей шифрования.
Пример 9-23. Генерация случайных чисел
# $RANDOM возвращает различные случайные числа при каждом обращении к ней.
# Диапазон изменения: 0 - 32767 (16-битовое целое со знаком).
echo "$MAXCOUNT случайных чисел:"
while [ "$count" -le $MAXCOUNT ] # Генерация 10 ($MAXCOUNT) случайных чисел.
let "count += 1" # Нарастить счетчик.
# Если вам нужны случайные числа не превышающие определенного числа,
# воспользуйтесь оператором деления по модулю (остаток от деления).
echo "Случайное число меньше $RANGE --- $number"
# Если вы желаете ограничить диапазон "снизу",
# то просто производите генерацию псевдослучайных чисел в цикле до тех пор,
# пока не получите число большее нижней границы.
while [ "$number" -le $FLOOR ]
echo "Случайное число, большее $FLOOR --- $number"
# Эти два способа могут быть скомбинированы.
while [ "$number" -le $FLOOR ]
let "number %= $RANGE" # Ограничение "сверху" числом $RANGE.
echo "Случайное число в диапазоне от $FLOOR до $RANGE --- $number"
# Генерация случайных "true" и "false" значений.
# let "number >>= 14" дает более равномерное распределение
# (сдвиг вправо смещает старший бит на нулевую позицию, остальные биты обнуляются).
# Можно имитировать бросание 2-х игровых кубиков.
SPOTS=7 # остаток от деления на 7 дает диапазон 0 - 6.
# Кубики "выбрасываются" раздельно.
while [ "$die1" -eq $ZERO ] # Пока на "кубике" ноль.
let "die1 = $RANDOM % $SPOTS" # Имитировать бросок первого кубика.
while [ "$die2" -eq $ZERO ]
let "die2 = $RANDOM % $SPOTS" # Имитировать бросок второго кубика.
let "throw = $die1 + $die2"
echo "Результат броска кубиков = $throw"
Пример 9-24. Выбор случайной карты из колоды