Дейв Тейлор - Сценарии командной оболочки. 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-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
····cat << EOF >&2
··Usage: $0 temperature[F|C|K]
··where the suffix:
····F······indicates input is in Fahrenheit (default)
····C······indicates input is in Celsius
····K······indicates input is in Kelvin
··EOF
····exit 1
··fi
··unit="$(echo $1|sed −e 's/[-[: digit: ]]*//g' | tr '[: lower: ]' '[: upper: ]')"
··temp="$(echo $1|sed −e 's/[^-[: digit: ]]*//g')"
··case ${unit:=F}
··in
··F) # Градусы Фаренгейта в градусы Цельсия: Tc = (F — 32) / 1.8
····farn="$temp"
····cels="$(echo "scale=2;($farn — 32) / 1.8" | bc)"
····kelv="$(echo "scale=2;$cels + 273.15" | bc)"
····;;
··C) # Градусы Цельсия в градусы Фаренгейта: Tf = (9/5)*Tc+32
····cels=$temp
····kelv="$(echo "scale=2;$cels + 273.15" | bc)"
····farn="$(echo "scale=2;(1.8 * $cels) + 32" | bc)"
····;;
··K) # Градусы Цельсия = Kelvin — 273.15,
······#·· затем использовать формулу градусы Цельсия — > градусы Фаренгейта
····kelv=$temp
····cels="$(echo "scale=2; $kelv — 273.15" | bc)"
····farn="$(echo "scale=2; (1.8 * $cels) + 32" | bc)"
····;;
····*)
····echo "Given temperature unit is not supported"
····exit 1
··esac
··echo "Fahrenheit = $farn"
··echo "Celsius = $cels"
··echo "Kelvin = $kelv"
··exit 0
Как это работает
Большая часть сценария, вероятно, ясна, но давайте внимательнее рассмотрим математические вычисления и регулярные выражения, выполняющие основную работу. Многие плохо воспринимают математические формулы в таком виде, поэтому ниже приводится формула преобразования температуры по Фаренгейту в температуру по Цельсию:

Преобразованную в последовательность для передачи калькулятору bc и вычисления, эту формулу можно видеть в строке . Обратное преобразование из градусов Цельсия в градусы Фаренгейта реализовано в строке
. Этот сценарий также переводит температуру из градусов Цельсия в градусы Кельвина
. Он наглядно демонстрирует одну важную причину использовать мнемонические имена для переменных: код становится проще для чтения и отладки.
Еще один интересный аспект сценария — регулярные выражения, наиболее замысловатое из которых находится в строке . Понять эту строку проще, если развернуть операцию подстановки, выполняемую sed. Подстановка всегда имеет вид s/old/new/ ; в данном случае шаблон old описывает строку, начинающуюся с ноля или более дефисов (-), за которыми следует любое количество цифр (как вы помните, [: digit: ] — это форма записи класса символов в ANSI, представляющего собой произвольную цифру, а звездочка (*) обозначает ноль или более вхождений предыдущего шаблона). Шаблон new описывает, чем заменить совпадение с шаблоном old , и в данном случае это всего лишь //, то есть пустой шаблон. Его удобно использовать, когда требуется просто удалить совпадения с шаблоном old . Данная операция подстановки фактически удаляет все цифры и дефисы так, что ввод -31f превращается в f и мы получаем возможность определить шкалу измерения температуры. После этого команда tr нормализует результат, преобразуя его в верхний регистр, то есть строка -31f, например, превращается в F.
Другое выражение sed выполняет противоположную операцию : оно удаляет все, что не является частью числа, используя оператор ^ для инвертирования совпадения с любым символом в классе [: digit: ]. (В большинстве языков программирования инвертирование выполняет оператор!.) В результате получается значение для преобразования с применением соответствующей формулы.
Запуск сценария
Сценарий имеет простой и понятный формат входных данных, хотя и необычный для команд Unix. Сценарию передается числовое значение с необязательным символом в конце, обозначающим шкалу; в отсутствие этого символа предполагается, что значение температуры представлено в градусах Фаренгейта.
Чтобы узнать температуру в градусах Цельсия и Кельвина, эквивалентную 0° Фаренгейта, введите 0F. Чтобы узнать температуру в градусах Цельсия и Фаренгейта, эквивалентную 100° Кельвина, введите 100K. А чтобы узнать температуру в градусах Кельвина и Фаренгейта, эквивалентную 100° Цельсия, введите 10 °C.
Похожий прием использования односимвольного обозначения в конце мы увидим в главе 7, в сценарии № 60, который выполняет преобразования между валютами.
Результаты
В листинге 3.9 показано несколько примеров преобразования температур.
Листинг 3.9.Тестирование сценария convertatemp несколькими преобразованиями
$ convertatemp 212
Fahrenheit = 212
Celsius = 100.00
Kelvin = 373.15
$ convertatemp 10 °C
Fahrenheit = 212.00
Celsius = 100
Kelvin = 373.15
$ convertatemp 100K
Fahrenheit = -279.67
Celsius = -173.15
Kelvin = 100
Усовершенствование сценария
В сценарий можно добавить поддержку нескольких флагов, чтобы ограничить вывод единственным результатом. Например, команда convertatemp −c 100F выводила бы только значение в градусах Цельсия, эквивалентное 100° Фаренгейта. Это помогло бы также упростить использование данного сценария внутри других.
№ 25. Вычисление платежей по кредиту
Другой распространенный вид вычислений, который наверняка пригодится пользователям — оценка платежей по кредиту. Сценарий в листинге 3.10 помогает также ответить на вопрос: «Куда потратить премию?», — и еще один, связанный с ним: «Могу ли я наконец позволить себе купить новую Tesla?».
Формула вычисления платежей, основанная на сумме кредита, процентах и его продолжительности, выглядит непростой, тем не менее грамотное использование переменных может помочь обуздать этого математического зверя и сделать вычисления на удивление простыми и понятными.
Код
Листинг 3.10.Сценарий loancalc
··#!/bin/bash
··# loancalc — По заданной сумме кредита, процентной ставке
··#·· и продолжительности (в годах), вычисляет суммы платежей
··# Формула: M = P * (J / (1 — (1 + J) ^ −N)),
··#·· где P = сумма кредита, J = месячная процентная ставка, N = протяженность·· #·· (месяцев).
··# Обычно пользователи вводят P, I (годовая процентная ставка) и L (протяженность·· #·· в годах).
Интервал:
Закладка: