Выбрать главу

Первая последовательность команд в подоболочке, в строке , извлекает первый символ из поля с названием месяца и с помощью tr преобразует его в верхний регистр (последовательность echo $1|cut −c1 можно также записать в стиле POSIX: ${1 %${1#?}}, как было показано выше). Вторая последовательность, в строке , извлекает второй и третий символы и преобразует их в нижний регистр. В результате получается трехсимвольное сокращенное название месяца с первым символом в верхнем регистре. Обратите внимание, что в данном случае не проверяется — содержит ли исходное поле допустимое название месяца, в отличие от случая, когда месяц задается числом.

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

Для максимальной гибкости будущих сценариев, использующих 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()

··{

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

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

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