Следующий шаг — добавление основной логики игры. В
генерируется случайное число в диапазоне от 1 до 100; в
пользователь делает попытку угадать это число; затем пользователю сообщается, что число слишком большое
или слишком маленькое
, пока он наконец не угадает правильное значение. После ввода всего основного кода можно попробовать запустить сценарий и посмотреть, как он работает. Ниже демонстрируется проверка работы сценария из листинга 1.30:
$ hilow
./013-hilow.sh: line 19: unexpected EOF while looking for matching '"’
./013-hilow.sh: line 22: syntax error: unexpected end of file
Опля! Мы столкнулись с проклятием разработчиков сценариев: неожиданный конец файла (EOF). Сообщение говорит, что ошибка находится в строке 19, но это не означает, что она действительно там. На самом деле строка 19 не содержит ошибок:
$ sed −n 19p hilow
echo "Right!! Guessed $number in $guesses guesses."
Чтобы понять причину ошибки, вспомните, что строки в кавычках могут содержать символы перевода строки. То есть, встретив кавычки, по ошибке не закрытые как следует, командная оболочка просто продолжит читать сценарий, стараясь найти парную закрывающую кавычку, и останавливается, только встретив самую последнюю и обнаружив, что в сценарии что-то неправильно.
Следовательно, проблема должна находиться где-то выше. В сообщении об ошибке есть единственная полезная деталь — оно указывает, какой символ не был найден. То есть можно попробовать с помощью grep извлечь все строки, содержащие кавычки, и затем отфильтровать те из них, что содержат по две кавычки, как показано ниже:
$ grep '"' 013-hilow.sh | egrep −v '.*".*".*'
echo"… smaller!
Вот и все! В строке
, сообщающей, что число, предложенное пользователем, слишком мало, отсутствует закрывающая кавычка. Добавим ее в конец строки и повторим попытку запустить сценарий:
$ hilow
./013-hilow.sh: line 7: unexpected EOF while looking for matching ')’
./013-hilow.sh: line 22: syntax error: unexpected end of file
Не вышло. Еще одна проблема. Выражений в круглых скобках в сценарии немного, поэтому мы можем просто посмотреть и увидеть, что в выражении, вычисляющем случайное число, отсутствует закрывающая скобка:
number=$(($$ % $biggest) # Случайное число от 1 до $biggest
Исправим эту ошибку, добавив закрывающую круглую скобку в конец выражения, но перед комментарием. А теперь игра заработает? Давайте попробуем:
$ hilow
Guess? 33
… bigger!
Guess? 66
… bigger!
Guess? 99
… bigger!
Guess? 100
… bigger!
Guess? ^C
Почти получилось. Но при попытке ввести максимально возможное значение 100 появляется ответ, что загаданное число больше (bigger), значит, в логике игры допущена ошибка. Искать такие ошибки особенно сложно, потому что никакая, даже самая замысловатая команда grep или sed не поможет выявить проблему. Вернитесь к коду и попробуйте найти ошибку самостоятельно.
Чтобы упростить поиск, можно добавить несколько команд echo, вывести значение, выбранное пользователем, и проверить, какое число введено и какое проверяется. Соответствующий раздел кода начинается в строке
, но для удобства приведем эти строки еще раз:
/bin/echo −n "Guess?"; read answer
if ["$guess" −lt $number]; then
Изменив команду echo и исследовав эти две строки, мы заметили ошибку: ввод пользователя читается в переменную answer, а проверяется переменная guess. Глупая, но не такая уж редкая ошибка (особенно если имеются переменные с необычными для вас именами). Чтобы исправить ошибку, нужно заменить read answer на read guess.
Наконец сценарий работает правильно, как показано в листинге 1.31.
Листинг 1.31.Сценарий hilow работает без ошибок
$ hilow
Guess? 50
… bigger!
Guess? 75
… bigger!
Guess? 88
… smaller!
Guess? 83
… smaller!
Guess? 80
… smaller!
Guess? 77
… bigger!
Guess? 79
Right!! Guessed 79 in 7 guesses.
Усовершенствование сценария
Самая досадная ошибка, кроющаяся в этом маленьком сценарии, — отсутствие проверки ввода. Попробуйте ввести произвольную строку вместо числа, и сценарий завершится с сообщением об ошибке. Мы легко могли бы добавить элементарную проверку, включив следующие строки в цикл while:
Читать дальше