Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание

Тут можно читать онлайн Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство Питер, год 2017. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
  • Автор:
  • Жанр:
  • Издательство:
    Питер
  • Год:
    2017
  • Город:
    СПб.
  • ISBN:
    978-5-496-03029-8
  • Рейтинг:
    5/5. Голосов: 11
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 100
    • 1
    • 2
    • 3
    • 4
    • 5

Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание краткое содержание

Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - описание и краткое содержание, автор Дейв Тейлор, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru
Сценарии командной оболочки помогают системным администраторам и программистам автоматизировать рутинные задачи с тех самых пор, как появились первые компьютеры. С момента выхода первого издания этой книги в 2004 году многое изменилось, однако командная оболочка bash только упрочила свои лидирующие позиции. Поэтому умение использовать все ее возможности становится насущной необходимостью для системных администраторов, инженеров и энтузиастов. В этой книге описываются типичные проблемы, с которыми можно столкнуться, например, при сборке программного обеспечения или координации действий других программ. А решения даются так, что их легко можно взять за основу и экстраполировать на другие схожие задачи.
Цель этой книги — продемонстрировать практические приемы программирования сценариев на bash и познакомить с самыми распространенными утилитами на коротких и компактных примерах, не вдаваясь в излишние подробности. Экспериментируйте с этими сценариями — ломайте, исправляйте и приспосабливайте их под свои нужды, чтобы понять, как они работают. Только так вы сможете решать самые сложные задачи.

Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - читать онлайн бесплатно полную версию (весь текст целиком)

Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - читать книгу онлайн бесплатно, автор Дейв Тейлор
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

····#·· поэтому дальше просто продолжается последовательный обход массива

····#·· до обнаружения первой доступной карты.

····randomcard=1

картинка 509····while [${newdeck[$randomcard]} −eq 0]

····do

······randomcard=$(($randomcard + 1))

····done

····picked=$randomcard

····deck[$picked]=0 # Выбрали — удалить ее.

····return $picked

··}

··function showCard

··{

····# Функция использует операции деления и взятия остатка для определения

····#·· масти и достоинства, хотя в этой игре значение имеет только достоинство.

····#·· Однако для представления важно иметь полную информацию.

····card=$1

····if [$card −lt 1 −o $card −gt 52]; then

······echo "Bad card value: $card"

······exit 1

····fi

····# деление и взятие остатка — школьные годы не были потрачены впустую!

картинка 510····suit="$(((($card — 1) / 13) + 1))"

····rank="$(($card % 13))"

····case $suit in

······1) suit="Hearts"··;;

······2) suit="Clubs"····;;

······3) suit="Spades"··;;

······4) suit="Diamonds";;

······*) echo "Bad suit value: $suit"

··········exit 1

····esac

····case $rank in

······0) rank="King"··;;

······1) rank="Ace"··;;

······11) rank="Jack"··;;

······12) rank="Queen";;

····esac

····cardname="$rank of $suit"

··}

картинка 511··function dealCards

··{

····# В игре Раз-два раздаются две карты…

····card1=${newdeck[1]} # Колода перетасована, поэтому

····card2=${newdeck[2]} #·· выдаем две верхних карты

····card3=${newdeck[3]} #·· и снимаем третью, но пока не показываем.

····rank1=$((${newdeck[1]} % 13)) # И сразу определяем достоинства, чтобы

····rank2=$((${newdeck[2]} % 13)) #·· упростить последующие вычисления.

····rank3=$((${newdeck[3]} % 13))

····# Исправить значение для короля: по умолчанию оно равно 0,

····#·· сделать равным 13.

····if [$rank1 −eq 0]; then

······rank1=13;

····fi

····if [$rank2 −eq 0]; then

······rank2=13;

····fi

····if [$rank3 −eq 0]; then

······rank3=13;

····fi

····# Теперь поменяем сданные карты местами так, чтобы card1 всегда

····#·· была меньше card2.

картинка 512····if [$rank1 −gt $rank2]; then

······temp=$card1; card1=$card2; card2=$temp

······temp=$rank1; rank1=$rank2; rank2=$temp

····fi

····showCard $card1; cardname1=$cardname

····showCard $card2; cardname2=$cardname

····showCard $card3; cardname3=$cardname # Shhh, it's a secret for now.

картинка 513····echo "I've dealt: "; echo " $cardname1"; echo " $cardname2"

··}

··function introblurb

··{

····cat << EOF

Welcome to Acey Deucey. The goal of this game is for you to correctly guess

whether the third card is going to be between the two cards I'll pull from

the deck. For example, if I flip up a 5 of hearts and a jack of diamonds,

you'd bet on whether the next card will have a higher rank than a 5 AND a

lower rank than a jack (that is, a 6, 7, 8, 9, or 10 of any suit).

Ready? Let's go!

EOF

··}

··games=0

··won=0

··if [$# −gt 0]; then # Полезная информация, если параметр определен

····introblurb

··fi

··while [/bin/true]; do

····initializeDeck

····shuffleDeck

····dealCards

····splitValue=$(($rank2 −$rank1))

····if [$splitValue −eq 0]; then

······echo "No point in betting when they're the same rank!"

······continue

····fi

····/bin/echo −n "The spread is $splitValue. Do you think the next card will "

····/bin/echo −n "be between them? (y/n/q) "

····read answer

····if ["$answer" = "q"]; then

······echo ""

······echo "You played $games games and won $won times."

······exit 0

····fi

····echo "I picked: $cardname3"

····# Третья карта попадает между первыми двумя? Проверим.

····#·· Помните, равные значения = проигрыш.

картинка 514····if [$rank3 −gt $rank1 −a $rank3 −lt $rank2]; then # Выигрыш!

······winner=1

····else

······winner=0

····fi

····if [$winner −eq 1 −a "$answer" = "y"]; then

······echo "You bet that it would be between the two, and it is. WIN!"

······won=$(($won + 1))

····elif [$winner −eq 0 −a "$answer" = "n"]; then

······echo "You bet that it would not be between the two, and it isn't. WIN!"

······won=$(($won + 1))

····else

······echo "Bad betting strategy. You lose."

····fi

····games=$(($games + 1)) # How many times do you play?

··done

··exit 0

Как это работает

Моделирование колоды карт — непростая задача. Важно решить, как представлять сами карты и как «тасовать» или случайным образом организовывать колоду.

Чтобы решить эту проблему, в сценарии создается два массива по 52 элемента: deck[] картинка 515и newdeck[] картинка 516. Первый массив представляет упорядоченную колоду карт, в котором достоинство каждой карты замещается значением -1 при ее «извлечении» из колоды, а второй, newdeck[], представляет колоду, куда в случайное место помещается извлеченная карта.

То есть массив newdeck[] представляет «перетасованную» колоду. Даже при том, что в этой игре используются только первые три карты, для нас гораздо интереснее рассмотреть универсальное решение, чем специализированное.

Это означает, что сценарий в чем-то избыточен. Но ведь правда же интересно!

Давайте пройдемся по функциям и посмотрим, как все устроено. Во-первых, инициализация колоды реализуется действительно просто, в чем нетрудно убедиться, вернувшись назад и взглянув на функцию initializeDeck.

Аналогично функция shuffleDeck выглядит на удивление прямолинейной, потому что всю основную работу в действительности выполняет функция pickCard. Функция shuffleDeck просто обходит 52 элемента в массиве deck[], случайно выбирая элемент, который прежде не был выбран, и сохраняет его в очередном n -м элементе массива newdeck[].

Давайте внимательно исследуем функцию pickCard картинка 517, потому что именно она выполняет основную работу, связанную с тасованием колоды. Функция разбита на два блока: первый пытается выбрать случайную доступную карту, ограничивая число попыток значением $threshold. Так как функция вызывается снова и снова, первые вызовы всегда будут успешно обрабатываться этим блоком, но потом, когда 50 карт окажутся перемещены в newdeck[], высока вероятность того, что 10 попыток случайно попасть в элементы с оставшимися картами не увенчаются успехом. Это блок цикла while картинка 518.

После того как значение $errcount увеличится до значения $threshold, стратегия случайного выбора отбрасывается ради сохранения высокой производительности и сценарий переходит ко второму блоку: он выполняет обход массива, пока не найдет первую доступную карту. Это блок картинка 519.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Дейв Тейлор читать все книги автора по порядку

Дейв Тейлор - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание отзывы


Отзывы читателей о книге Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание, автор: Дейв Тейлор. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x