При наличии доступа к GNU-команде date в Unix или GNU/Linux можно использовать совершенно иной способ проверки високосных лет. Попробуйте выполнить следующую команду и посмотрите, что получится:
$ date −d 12/31/1996 +%j
Если у вас в системе используется новейшая, улучшенная версия date, вы получите результат 366. Более старая версия просто пожалуется на ошибочный формат входных данных. Теперь подумайте о результате, возвращаемом новейшей командой date. Сможете ли вы написать двухстрочную функцию, проверяющую високосный год?
Наконец, данный сценарий слишком терпимо относится к названиям месяцев, например, название febmama будет опознано как допустимое, потому что инструкция case в строке
проверяет только первые три буквы. Эту проблему можно устранить, организовав точную проверку общепринятых сокращений (таких как feb) и полных названий месяцев (february), и даже некоторых типичных опечаток (febuary). Все это легко реализуется, было бы желание!
№ 8. Улучшение некачественных реализаций echo
Как упоминалось в разделе «Что такое POSIX?» в начале этой главе, большинство современных реализаций Unix и GNU/Linux включают команду echo, поддерживающую флаг −n, который подавляет вывод символа перевода строки в конце, но такая поддержка имеется не во всех реализациях. Некоторые для подавления поведения по умолчанию используют специальный символ \c, другие просто добавляют символ перевода строки, не давая никакой возможности изменить это поведение.
Выяснить, какая реализация echo используется в текущей системе, довольно просто: введите следующие команды и посмотрите, что из этого получится:
$ echo −n "The rain in Spain"; echo " falls mainly on the Plain"
Если команда echo поддерживает флаг −n, вы увидите следующий вывод:
The rain in Spain falls mainly on the Plain
Если нет, вывод будет иметь следующий вид:
-n The rain in Spain
falls mainly on the Plain
Гарантировать определенный формат вывода очень важно, и эта важность будет расти с увеличением интерактивности сценариев. Так что мы напишем альтернативную версию echo, с именем echon, которая всегда будет подавлять вывод завершающего символа перевода строки. Благодаря этому мы получим достаточно надежный инструмент, который сможем использовать, когда понадобится функциональность echo −n.
Способов исправить проблему с командой echo так же много, как страниц в этой книге. Но больше всего нам нравится очень компактная реализация, которая просто фильтрует ввод с помощью команды awk printf, как показано в листинге 1.16.
Листинг 1.16.Простая альтернатива echo, использующая команду awk printf
echon()
{
··echo "$*" | awk '{ printf "%s", $0 }'
}
Однако есть возможность избежать накладных расходов на вызов команды awk. Если у вас в системе имеется команда printf, используйте ее в сценарии echon, как показано в листинге 1.17.
Листинг 1.17.Альтернатива echo, использующая команду printf
echon()
{
··printf "%s" "$*"
}
А как быть, если команды printf нет и вы не желаете использовать awk? Тогда отсекайте любые завершающие символы перевода строки с помощью команды tr, как показано в листинге 1.18.
Листинг 1.18.Простая альтернатива echo, использующая команду tr
echon()
{
··echo "$*" | tr −d '\n'
}
Это простой и эффективный способ с хорошей переносимостью.
Просто добавьте этот сценарий в каталог из списка PATH, и вы сможете заменить все вызовы echo −n командой echon, надежно помещающей текстовый курсор в конец строки после вывода.
Для демонстрации функции echon сценарий принимает аргумент и выводит его, затем читает ввод пользователя. В листинге 1.19 показан сеанс тестирования сценария.
Листинг 1.19.Тестирование команды echon
$ echon "Enter coordinates for satellite acquisition: "
Enter coordinates for satellite acquisition: 12,34
Усовершенствование сценария
Скажем честно: тот факт, что одни командные оболочки имеют команду echo, поддерживающую флаг −n, другие предполагают использование специального символа \c в конце вывода, а третьи вообще не дают возможности подавить отображение символа перевода строки, доставляет массу проблем создателям сценариев. Чтобы устранить это несоответствие, можно написать свою функцию, которая автоматически проверит поведение echo, определит, какая версия используется в системе и затем изменит вызов соответственно. Например, можно выполнить команду echo −n hi | wc −c и проверить количество символов в результате: два (hi), три (hi плюс символ перевода строки), четыре (-n hi) или пять (-n hi плюс символ перевода строки).
Читать дальше