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

Шрифт
Интервал

Результаты

Листинг 1.6. Тестирование сценария normdate

>$ normdate 8 3 62

>normdate: expected 4-digit year value.

>$ normdate 8 3 1962

>Aug 3 1962

>$ normdate AUGUST 03 1962

>Aug 03 1962

Обратите внимание, что этот сценарий нормализует только представление месяца; представление дня (в том числе с ведущими нулями) и года не изменяется.

Усовершенствование сценария

Прежде чем знакомиться с разными усовершенствованиями, которые можно добавить в этот сценарий, загляните в раздел с описанием сценария № 7, где используется normdate для проверки вводимых дат.

Одно из изменений, которые можно внедрить уже сейчас, касается включения поддержки дат в форматах MM/DD/YYYY и MM-DD-YYYY, для чего достаточно добавить следующий код непосредственно перед первым условным оператором:

>if [$# −eq 1]; then # Чтобы компенсировать форматы с / и -

>··set −$(echo $1 | sed 's/[\/\-]/ /g')

>fi

С этим изменением сценарий позволяет вводить и нормализовать даты в следующих распространенных форматах:

>$ normdate 6-10-2000

>Jun 10 2000

>$ normdate March-11-1911

>Mar 11 1911

>$ normdate 8/3/1962

>Aug 3 1962

Если вы прочитаете код очень внимательно, то заметите, что в нем можно также усовершенствовать проверку поля с номером года, не говоря уже о поддержке разных международных форматов представления дат. Мы оставляем это вам как упражнение для самостоятельных исследований!

№ 4. Удобочитаемое представление больших чисел

Программисты часто допускают типичную ошибку, отображая результаты вычислений без предварительного форматирования. Пользователям сложно определить, например, сколько миллионов содержится в числе 43 245 435, не подсчитав количество цифр справа налево и не добавив мысленно запятые после каждого третьего знака. Сценарий в листинге 1.7 выводит большие числа в удобочитаемом формате.

Код

Листинг 1.7. Сценарий nicenumber форматирует большие числа, делая их удобочитаемыми

>··#!/bin/bash

>··# nicenumber — Отображает переданное число в формате представления с запятыми.

>··#·· Предполагает наличие переменных DD (decimal point delimiter — разделитель

>··#·· дробной части) и TD (thousands delimiter — разделитель групп разрядов).

>··#·· Создает переменную nicenum с результатом, а при наличии второго аргумента

>··#·· дополнительно выводит результат в стандартный вывод.

>··nicenumber()

>··{

>····# Обратите внимание: предполагается, что для разделения дробной и целой

>····#·· части во входном значении используется точка.

>····#·· В выходной строке в качестве такого разделителя используется точка, если

>····#·· пользователь не определил другой символ с помощью флага −d.

>

····integer=$(echo $1 | cut −d. -f1) # Слева от точки

>

····decimal=$(echo $1 | cut −d. -f2) # Справа от точки

>····# Проверить присутствие дробной части в числе.

>····if ["$decimal"!= "$1"]; then

>······# Дробная часть есть, включить ее в результат.

>······result="${DD:= '.'}$decimal"

>····fi

>··thousands=$integer

>··while [$thousands −gt 999]; do

>····remainder=$(($thousands % 1000)) # Три последние значимые цифры

>····# В 'remainder' должно быть три цифры. Требуется добавить ведущие нули?

>····while [${#remainder} −lt 3]; do # Добавить ведущие нули

>······remainder="0$remainder"

>····done

>····result="${TD:=","}${remainder}${result}" # Конструировать справа налево

>····thousands=$(($thousands / 1000)) # Оставить остаток, если есть

>··done

>··nicenum="${thousands}${result}"

>··if [! -z $2]; then

>····echo $nicenum

>··fi

>}

>DD="." # Десятичная точка для разделения целой и дробной части

>TD="," # Разделитель групп разрядов

># Начало основного сценария

># =================

>··while getopts "d: t: " opt; do

>····case $opt in

>······d) DD="$OPTARG";;

>······t) TD="$OPTARG";;

>····esac

>··done

>··shift $(($OPTIND — 1))

>··# Проверка ввода

>··if [$# −eq 0]; then

>····echo "Usage: $(basename $0) [-d c] [-t c] number"

>····echo " −d specifies the decimal point delimiter"

>····echo " −t specifies the thousands delimiter"

>····exit 0

>··fi

>··nicenumber $1 1 # Второй аргумент заставляет nicenumber вывести результат.

>··exit 0

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

Основная работа в этом сценарии выполняется циклом while внутри функции nicenumber()

, который последовательно удаляет три младших значащих разряда из числового значения в переменной thousands
и присоединяет их к создаваемой форматированной версии числа
. Затем цикл уменьшает числовое значение в thousands
и повторяет итерацию, если необходимо. Вслед за функцией nicenumber() начинается основная логика сценария. Сначала с помощью getopts
, анализируются параметры, переданные в сценарий, и затем вызывается функция nicenumber()
с последним аргументом, указанным пользователем.

Запуск сценария

Чтобы опробовать этот сценарий, просто вызовите его с очень большим числом. Сценарий добавит десятичную точку и разделители групп разрядов, использовав значения либо по умолчанию, либо указанные с помощью флагов.

Результат можно внедрить в сообщение, как показано ниже:

>echo "Do you really want to pay \$$(nicenumber $price)?"

Результаты

Сценарий nicenumber может также принимать дополнительные параметры. Листинг 1.8 демонстрирует форматирование нескольких чисел с использованием сценария.

Листинг 1.8: Тестирование сценария nicenumber


Рекомендуем почитать
Виртуальные  машины: несколько компьютеров в  одном

Применение виртуальных машин дает различным категориям пользователей — от начинающих до IT-специалистов — множество преимуществ. Это и повышенная безопасность работы, и простота развертывания новых платформ, и снижение стоимости владения. И потому не случайно сегодня виртуальные машины переживают второе рождение.В книге рассмотрены три наиболее популярных на сегодняшний день инструмента, предназначенных для создания виртуальных машин и управления ими: Virtual PC 2004 компании Microsoft, VMware Workstation от компании VMware и относительно «свежий» продукт — Parallels Workstation, созданный в компании Parallels.


Недокументированные и малоизвестные возможности Windows XP

Книга содержит подробные сведения о таких недокументированных или малоизвестных возможностях Windows XP, как принципы работы с программами rundll32.exe и regsvr32.exe, написание скриптов сервера сценариев Windows и создание INF-файлов. В ней приведено описание оснасток, изложены принципы работы с консолью управления mmc.exe и параметрами реестра, которые изменяются с ее помощью. Кроме того, рассмотрено большое количество средств, позволяющих выполнить тонкую настройку Windows XP.Эта книга предназначена для опытных пользователей и администраторов, которым интересно узнать о нестандартных возможностях Windows.


Тонкости реестра Windows Vista. Трюки и эффекты

Реестр Windows является важной частью операционной системы, во многом определяющей ее работу. Изучив приведенный в этой книге материал, вы научитесь редактировать реестр Windows Vista по своему усмотрению, а также освоите многочисленные приемы оптимизации содержащихся в нем настроек операционной системы.


Отладка систем реального времени

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


Iptables Tutorial 1.1.19

Iptables Tutorial 1.1.19Автор: (C) Oskar AndreassonCopyright (C) 2001-2002 by Oskar AndreassonПеревод: (C) Андрей КиселевПоследнюю версию документа можно получить по адресу: http://iptables-tutorial.frozentux.netfb2-документ отформатирован с использованием большого количества тегов и . Чтобы в «читалке» (в частности, Haali Reader) текст выглядел «красиво», настройте свойства соотвествующих стилей (emphasis и strong), изменив, например, их цвета или начертания. (прим. автора fb2-документа)


Свободные программы и системы в школе

Курс лекций, включенных в брошюру, знакомит читателя с популярными свободными программами и системами, полезными при преподавании информатики в средней школе. В обзор вошли основы открытых операционных систем, сведения о пакете «офисных» программ OpenOffice.org, коммуникационном пакете Mozilla, графическом редакторе GIMP, современных графических средах GNOME и KDE и других программах.Для преподавателей информатики и методистов, а также для студентов и аспирантов соответствующих специальностей.© 2002-3, Максим Отставнов.© 2002, Андрей Добровольский (раздел 3.1).Использован текст лекций, публиковавшихся автором в приложении к газете «Первое сентября» «Информатика» (http://inf.1september.ru) в 2002-3 г., материалы брошюры «Прикладные свободные программы в школе» (М.: 2003 г.), а также фрагменты статей, ранее публиковавшихся в журналах «Компьютерра» и «Домашний компьютер».Материалы, представленные в этой книге, также доступны в Интернет на странице www.otstavnov.com/fsft на условиях Свободной лицензии ГНУ на документацию (GNU FDL)