Листинг 2.17.Сценарий DIR, имитирующий DOS-команду DIR в Unix
#!/bin/bash
# DIR — имитирует поведение команды DIR в DOS, принимает некоторые
#·· стандартные флаги команды DIR и выводит содержимое указанного каталога
function usage
{
cat << EOF >&2
··Usage: $0 [DOS flags] directory or directories
··Where:
····/D sort by columns
····/H show help for this shell script
····/N show long listing format with filenames on right
····/OD sort by oldest to newest
····/O-D sort by newest to oldest
····/P pause after each screenful of information
····/Q show owner of the file
····/S recursive listing
····/W use wide listing format
EOF
··exit 1
}
#####################
### ОСНОВНОЙ СЦЕНАРИЙ
postcmd=""
flags=""
while [$# −gt 0]
do
··case $1 in
····/D······) flags="$flags −x"··;;
····/H······) usage··············;;
····/[NQW]··) flags="$fl −l— l"··;;
····/OD····) flags="$flags −rt";;
····/O-D····) flags="$flags −t"··;;
····/P······) postcmd="more"····;;
····/S······) flags="$flags −s"··;;
··········*) # Неизвестный флаг: возможно, признак конца команды DIR;
··············#·· поэтому следует прервать цикл while.
··esac
··shift······ # Флаг обработан; проверить — есть ли что-то еще.
done
# Обработка флагов завершена; теперь выполнить саму команду:
if [! -z "$postcmd"]; then
··ls $flags "$@" | $postcmd
else
··ls $flags "$@"
fi
exit 0
Этот сценарий демонстрирует, что инструкция case в языке командной оболочки фактически проверяет регулярное выражение. Как можно видеть в строке
, DOS-флаги /N, /Q и /W отображаются в один и тот же Unix-флаг −l в окончательном вызове команды ls, и все это достигается с помощью простого регулярного выражения /[NQW].
Сохраните сценарий в файле с именем DIR (также желательно создать псевдоним dir=DIR, потому что командный интерпретатор DOS не различает регистр символов, в отличие от Unix). Теперь, вводя команду DIR с флагами, типичными для команды DIR в MS-DOS, пользователи будут получать осмысленные результаты (как показано в листинге 2.18), а не сообщение о том, что команда не найдена.
Листинг 2.18.Тестирование сценария DIR со списком файлов
$ DIR /OD /S ~/Desktop
total 48320
7720 PERP — Google SEO.pdf············ 28816 Thumbs.db
····0 Traffic Data······················8 desktop.ini
····8 gofatherhood-com-crawlerrors.csv··80 change-lid-close-behavior-win7-1.png
·· 16 top-100-errors.txt················176 change-lid-close-behavior-win7-2.png
····0 $RECYCLE.BIN······················400 change-lid-close-behavior-win7-3.png
····0 Drive Sunshine····················264 change-lid-close-behavior-win7-4.png
·· 96 facebook-forcing-pay.jpg·········· 32 change-lid-close-behavior-win7-5.png
10704 WCSS Source Files
Это список с содержимым указанного каталога, отсортированный в обратном хронологическом порядке, от более новых к более старым, и размерами файлов (для каталогов всегда выводится размер 0).
Усовершенствование сценария
В наши дни трудно найти человека, который помнил бы командную строку MS-DOS, но основные принципы работы с ней стоят того, чтобы их знать. Как одно из усовершенствований можно было бы реализовать вывод эквивалентной команды в Unix или Linux перед фактическим выполнением, и затем, после нескольких вызовов, сценарий мог бы просто показывать эквивалентную команду, но не выполнять ее. В этом случае пользователь будет вынужден запоминать новые команды, чтобы добиться желаемого!
№ 21. Вывод времени в разных часовых поясах
Основное требование, предъявляемое к команде date, — отображение даты и времени для часового пояса, настроенного в системе. Но как быть пользователям в дальней поездке, пересекающим несколько часовых поясов? Или тем, у кого есть друзья и коллеги, живущие в других уголках планеты, и им хотелось бы знать, который сейчас час, например, в Касабланке, Ватикане или Сиднее?
Как оказывается, команда date в большинстве современных разновидностей Unix опирается в своей работе на базу данных часовых поясов. Обычно хранящаяся в каталоге /usr/share/zoneinfo эта база данных содержит информацию о более чем 600 регионах и соответствующих им смещениях относительно универсального скоординированного времени (Universal Coordinated Time, UTC — часто также называется средним временем по Гринвичу, Greenwich Mean Time или GMT ). Команда date учитывает значение переменной окружения TZ, определяющей часовой пояс, которой можно присвоить любой регион из базы данных, например:
Читать дальше