Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Название:Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Автор:
- Жанр:
- Издательство:Питер
- Год:2017
- Город:СПб.
- ISBN:978-5-496-03029-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание краткое содержание
Цель этой книги — продемонстрировать практические приемы программирования сценариев на bash и познакомить с самыми распространенными утилитами на коротких и компактных примерах, не вдаваясь в излишние подробности. Экспериментируйте с этими сценариями — ломайте, исправляйте и приспосабливайте их под свои нужды, чтобы понять, как они работают. Только так вы сможете решать самые сложные задачи.
Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Guess a letter: m
* Nope, "m" does not appear in the word.
guessed: eioum, steps from gallows: 5, word so far: −e-e-iou-
Guess a letter: n
* Great! The letter "n" appears in the word!
guessed: eioumn, steps from gallows: 5, word so far: −en-en-iou-
Guess a letter: r
* Nope, "r" does not appear in the word.
guessed: eioumnr, steps from gallows: 4, word so far: −en-en-iou-
Guess a letter: s
* Great! The letter "s" appears in the word!
guessed: eioumnrs, steps from gallows: 4, word so far: sen-en-ious-
Guess a letter: t
* Great! The letter "t" appears in the word!
guessed: eioumnrst, steps from gallows: 4, word so far: sententious-
Guess a letter: l
* Great! The letter "l" appears in the word!
guessed: eioumnrstl, steps from gallows: 4, word so far: sententiousl-
Guess a letter: y
** You’ve been pardoned!! Well done! The word was "sententiously".
*** New Game! ***
steps from gallows: 6, word so far: —-
Guess a letter: quit
Усовершенствование сценария
В сценарии командной оболочки трудно реализовать вывод графического изображения человечка на виселице, поэтому мы использовали альтернативу: подсчет «шагов до эшафота». Однако вы настроены серьезно, попробуйте использовать серии предопределенных фрагментов текстовой псевдографики, по одному для каждого шага, и выводить их по мере игры. Или поищите какую-нибудь другую метафору, не связанную с насилием!
Обратите внимание, что одно и то же слово может быть выбрано несколько раз в одном сеансе игры, хотя со списком по умолчанию, насчитывающим 2882 варианта, это маловероятно. Однако если вы все же беспокоитесь, можно добавить переменную для хранения всех использованных слов и при выборе нового сверяться с ней.
Наконец, попробуйте сортировать угаданные буквы в переменной guessed в алфавитном порядке. Это можно сделать несколькими способами, но мы советуем попробовать связку sed|sort.
№ 85. Угадай столицу
Теперь, когда у нас есть инструмент выбора случайной строки из файла, перед нами открываются широкие перспективы в создании самых разных игр-викторин. Мы поместили в список столицы всех 50 штатов США, доступный для загрузки по адресу: http://www.nostarch.com/wcss2/. Сохраните файл state.capitals.txt в своем каталоге /usr/lib/games . Сценарий в листинге 12.5 выбирает случайную строку из файла, выводит название штата и предлагает пользователю ввести название его столицы.
Код
Листинг 12.5.Сценарий states? реализующий игру «Угадай столицу»
#!/bin/bash
# states — игра "Угадай столицу". Требует наличия файла со списком
#·· штатов и их столиц state.capitals.txt.
db="/usr/lib/games/state.capitals.txt" # Формат: Штат[табуляция]Город.
if [! -r "$db"]; then
··echo "$0: Can't open $db for reading." >&2
··echo "(get state.capitals.txt" >&2
··echo "save the file as $db and you're ready to play!)" >&2
··exit 1
fi
guesses=0; correct=0; total=0
while ["$guess"!= "quit"]; do
··thiskey="$(randomquote $db)"
··# $thiskey — выбранная строка. Теперь нужно извлечь название штата
··#·· и города, и затем создать версию названия города со всеми буквами
··#·· в нижнем регистре для сопоставления.
··state="$(echo $thiskey | cut −d\ −f1 | sed 's/-/ /g')"
··city="$(echo $thiskey | cut −d\ −f2 | sed 's/-/ /g')"
··match="$(echo $city | tr '[: upper: ]' '[: lower: ]')"
··guess="??"; total=$(($total + 1));
··echo ""
··echo "What city is the capital of $state?"
··# Главный цикл, где все и происходит. Сценарий выполняет его, пока
··#·· город не будет правильно угадан, или пока пользователь не введет
··#·· "next", чтобы пропустить штат, или "quit", чтобы завершить игру.
··while ["$guess"!= "$match" −a "$guess"!= "next" −a "$guess"!= "quit"]
··do
····/bin/echo −n "Answer: "
····read guess
····if ["$guess" = "$match" −o "$guess" = "$city"]; then
······echo ""
······echo "*** Absolutely correct! Well done! ***"
······correct=$(($correct + 1))
······guess=$match
····elif ["$guess" = "next" −o "$guess" = "quit"]; then
······echo ""
······echo "$city is the capital of $state." # Вы ДОЛЖНЫ это знать:)
······else
······echo "I'm afraid that's not correct."
····fi
··done
done
echo "You got $correct out of $total presented."
exit 0
Как это работает
Для такой увлекательной игры сценарий states имеет очень простую реализацию. Файл с данными хранит пары штат/столица, все пробелы в названиях заменены дефисами, и два поля разделены единственным пробелом. Благодаря этому извлечение названий городов и штатов осуществляется очень просто .
Каждая попытка сравнивается с версией названия города, состоящей только из букв нижнего регистра (match), и с версией, где все буквы стоят в правильном регистре. Если ни в одном случае нет совпадения, введенное слово сравнивается с двумя командами: next и quit. Если обнаружится совпадение с любой из них, сценарий выводит правильный ответ и либо предлагает ввести столицу следующего штата, либо завершается. Если не найдено ни одного совпадения, попытка считается неудачной.
Запуск сценария
Этот сценарий не имеет аргументов, флагов или команд. Просто запустите его и играйте!
Результаты
Готовы проверить свое знание столиц штатов? Листинг 12.6 демонстрирует, насколько хорошо мы знаем столицы!
Листинг 12.6.Запуск игрового сценария states
$ states
What city is the capital of Indiana?
Answer: Bloomington
I’m afraid that’s not correct.
Answer: Indianapolis
*** Absolutely correct! Well done! ***
What city is the capital of Massachusetts?
Answer: Boston
*** Absolutely correct! Well done! ***
What city is the capital of West Virginia?
Answer: Charleston
*** Absolutely correct! Well done! ***
What city is the capital of Alaska?
Answer: Fairbanks
I’m afraid that’s not correct.
Answer: Anchorage
I’m afraid that’s not correct.
Answer: Nome
I’m afraid that’s not correct.
Answer: Juneau
*** Absolutely correct! Well done! ***
What city is the capital of Oregon?
Answer: quit
Salem is the capital of Oregon.
You got 4 out of 5 presented.
К счастью, игра запоминает количество только успешных попыток, а также не фиксирует, сколько раз вы обращались к Google, чтобы узнать ответ!
Усовершенствование сценария
Самый большой недостаток этой игры, пожалуй, ее придирчивость к правописанию. Неплохим усовершенствованием стал бы код, реализующий нечеткое сопоставление: чтобы, например, ответ пользователя Juneu вместо Juneau расценивался как правильный. Для этого можно было бы использовать модифицированный алгоритм Soundex (созвучия), который удаляет все гласные и из удвоенных согласных оставляет только одну (например, название Annapolis было бы преобразовано в npls). Это может оказаться слишком вольной трактовкой, но сама идея стоит того, чтобы ее рассмотреть.
Так же, как в других играх, в этой пригодились бы подсказки. Например, можно по запросу вывести первую букву правильного ответа и запоминать, как много подсказок запросил пользователь в сеансе игры.
Читать дальшеИнтервал:
Закладка: