Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - страница 14
Первая последовательность команд в подоболочке, в строке
Запуск сценария
Для максимальной гибкости будущих сценариев, использующих normdate, этот сценарий спроектирован так, что принимает исходные данные в виде трех аргументов командной строки, как показано в листинге 1.6. Если вы предполагаете использовать сценарий только интерактивно, предложите пользователю ввести дату в виде трех значений, однако это усложнит вызов normdate из других сценариев.
Результаты
Листинг 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.
>
>
>····# Проверить присутствие дробной части в числе.
>····if ["$decimal"!= "$1"]; then
>······# Дробная часть есть, включить ее в результат.
>······result="${DD:= '.'}$decimal"
>····fi
>··thousands=$integer
>
>
>····# В 'remainder' должно быть три цифры. Требуется добавить ведущие нули?