Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - страница 26
Результаты
Листинг 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 года. Но мы говорим о сценариях командной оболочки, а не о хитрости летоисчисления, так что оставим эту неточность без внимания.
№ 13. Отладка сценариев
Этот раздел не содержит настоящего сценария, но мы хотели бы потратить несколько страниц в книге, чтобы поговорить об основах отладки сценариев, потому что рано или поздно вы все равно столкнетесь с ошибками!
По нашему опыту, лучшая стратегия отладки — наращивать возможности сценариев постепенно. Некоторые программисты оптимистично надеются, что все заработает правильно с первого раза, но вы будете по-настоящему уверенно двигаться вперед, если начнете с малого. Кроме того, для трассировки переменных можно свободно использовать команды 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··················# Количество попыток
>
>··echo "Guess a number between 1 and $biggest"
>··while ["$guess" −ne $number]; do
>
>····if ["$guess" −lt $number]; then
>
>····elif ["$guess" −gt $number]; then
>
>····fi
>····guesses=$(($guesses + 1))
>··done
>··echo "Right!! Guessed $number in $guesses guesses."
>··exit 0
Как это работает
Чтобы было понятнее, как происходит получение случайного числа в
Запуск сценария
Отлаживая игру, прежде всего проверим и убедимся, что генерируемое число достаточно случайно. Для этого получим PID оболочки, в которой выполняется сценарий, и приведем его к требуемому диапазону, используя операцию % извлечения остатка от деления нацело
>$ echo $(($$ % 100))
>5
>$ echo $(($$ % 100))
>5
>$ echo $(($$ % 100))
>5
Операция работает, но числа не выглядят случайными. Если немного поразмыслить, становится понятно, почему так происходит: когда команда выполняется непосредственно в командной строке, она всегда получает одно и то же значение PID; но внутри сценария команда каждый раз будет выполняться в другой подоболочке, с другим значением PID.
Еще один способ получить случайное число — воспользоваться переменной окружения $RANDOM. Это не простая переменная! При каждом обращении к ней вы будете получать разные значения. Чтобы получить число в диапазоне от 1 до $biggest, используйте в строке