··echo "Right!! Guessed $number in $guesses guesses."
··exit 0
Как это работает
Чтобы было понятнее, как происходит получение случайного числа в
Запуск сценария
Отлаживая игру, прежде всего проверим и убедимся, что генерируемое число достаточно случайно. Для этого получим PID оболочки, в которой выполняется сценарий, и приведем его к требуемому диапазону, используя операцию % извлечения остатка от деления нацело
$ echo $(($$ % 100))
5
$ echo $(($$ % 100))
5
$ echo $(($$ % 100))
5
Операция работает, но числа не выглядят случайными. Если немного поразмыслить, становится понятно, почему так происходит: когда команда выполняется непосредственно в командной строке, она всегда получает одно и то же значение PID; но внутри сценария команда каждый раз будет выполняться в другой подоболочке, с другим значением PID.
Еще один способ получить случайное число — воспользоваться переменной окружения $RANDOM. Это не простая переменная! При каждом обращении к ней вы будете получать разные значения. Чтобы получить число в диапазоне от 1 до $biggest, используйте в строке
Следующий шаг — добавление основной логики игры. В
$ 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