Чтобы запустить тестовый сценарий, вызовите его из командной строки, подобно любому другому сценарию, как показано в листинге 1.29.
Листинг 1.29.Запуск сценария library-test
$ library-test
First off, do you have echo in your PATH? (1=yes, 2=no) 1
The echo command is in the PATH.
Enter a year you think might be a leap year: 432423
Your value is too big: largest acceptable value is 9999.
Please enter a year in the correct format: 432
You’re right! 432 is a leap year.
В случае ввода слишком большого значения, сообщение об ошибке будет показано жирным шрифтом. Кроме того, сообщение, подтверждающее правильность выбранного високосного года, отображается зеленым цветом.
Исторически 432 год не считается високосным, потому что учет високосных лет не производился до 1752 года. Но мы говорим о сценариях командной оболочки, а не о хитрости летоисчисления, так что оставим эту неточность без внимания.
Этот раздел не содержит настоящего сценария, но мы хотели бы потратить несколько страниц в книге, чтобы поговорить об основах отладки сценариев, потому что рано или поздно вы все равно столкнетесь с ошибками!
По нашему опыту, лучшая стратегия отладки — наращивать возможности сценариев постепенно. Некоторые программисты оптимистично надеются, что все заработает правильно с первого раза, но вы будете по-настоящему уверенно двигаться вперед, если начнете с малого. Кроме того, для трассировки переменных можно свободно использовать команды echo, а также запускать сценарии командой bash −x, чтобы обеспечить вывод отладочной информации, например:
$ bash −x myscript.sh
Как вариант, можно добавить команду set −x перед началом отлаживаемого фрагмента и set +x — после него, как показано ниже:
$ set −x
$./myscript.sh
$ set +x
Чтобы увидеть, как действуют флаги −x и +x, попробуем отладить простую игру «угадай число», представленную в листинге 1.30.
Листинг 1.30.Сценарий hilow, возможно содержащий несколько ошибок, который нужно отладить.
··#!/bin/bash
··# hilow — Простая игра "угадай число"
··biggest=100················# Максимальное возможное число
··guess=0····················# Число, предложенное игроком
··guesses=0··················# Количество попыток
··number=$(($$ % $biggest) # Случайное число от 1 до $biggest
··echo "Guess a number between 1 and $biggest"
··while ["$guess" −ne $number]; do
····/bin/echo −n "Guess?"; read answer
····if ["$guess" −lt $number]; then
······echo"… bigger!"
····elif ["$guess" −gt $number]; then
······echo"… smaller!
····fi
····guesses=$(($guesses + 1))
··done
··echo "Right!! Guessed $number in $guesses guesses."
··exit 0
Чтобы было понятнее, как происходит получение случайного числа в
, напомним, что специальная переменная $$ хранит числовой идентификатор процесса (Process ID, PID) командной оболочки, в которой выполняется сценарий. Обычно это 5- или 6-значное число. При каждом запуске сценарий получает новый PID. Последовательность % $biggest делит значение PID на заданное наибольшее значение и возвращает остаток. Иными словами, 5 % 4 = = 1, так же как 41 % 4. Это простой способ получения псевдослучайных чисел в диапазоне от 1 до $biggest.
Отлаживая игру, прежде всего проверим и убедимся, что генерируемое число достаточно случайно. Для этого получим PID оболочки, в которой выполняется сценарий, и приведем его к требуемому диапазону, используя операцию % извлечения остатка от деления нацело
. Для проверки операции введите в командной строке следующие команды:
$ echo $(($$ % 100))
5
$ echo $(($$ % 100))
5
$ echo $(($$ % 100))
5
Операция работает, но числа не выглядят случайными. Если немного поразмыслить, становится понятно, почему так происходит: когда команда выполняется непосредственно в командной строке, она всегда получает одно и то же значение PID; но внутри сценария команда каждый раз будет выполняться в другой подоболочке, с другим значением PID.
Еще один способ получить случайное число — воспользоваться переменной окружения $RANDOM. Это не простая переменная! При каждом обращении к ней вы будете получать разные значения. Чтобы получить число в диапазоне от 1 до $biggest, используйте в строке
выражение $(($RANDOM % $biggest + 1)).
Читать дальше