Пример H-1. VIEWDATA.BAT: пакетный файл DOS
Пример H-2. viewdata.sh: Результат преобразования VIEWDATA.BAT в сценарий командной оболочки
Приложение H. Преобразование пакетных (*.bat) файлов DOS в сценарии командной оболочкиБольшое число программистов начинало изучать скриптовые языки на PC, работающих под управлением DOS. Даже на этом "калеке" удавалось создавать неплохие сценарии, хотя это и требовало значительных усилий. Иногда еще возникает потребность в переносе пекетных файлов DOS на платформу UNIX, в виде сценариев командной оболочки. Обычно это не сложно, поскольку набор операторов, доступных в DOS, представляет из себя ограниченное подмножество эквивалентных команд, доступных в командной оболочке. Таблица H-1. Ключевые слова/переменные/операторы пакетных файлов DOS и их аналоги командной оболочки | Операторы пакетных файлов | Эквивалентные команды в UNIX | Описание |
|---|
| % | $ | префикс аргументов командной строки | | / | - | признак ключа (опции) | | \ | / | разделитель имен каталогов в пути | | == | = | (равно) сравнение строк | | !==! | != | (не равно) сравнение строк | | | | | | конвейер (канал) | | @ | set +v | не выводить текущую команду | | * | * | "шаблонный символ" в имени файла | | > | > | перенаправление (с удалением существующего файла) | | >> | >> | перенаправление (с добавлением в конец существующего файла) | | < | < | перенаправление ввода stdin | | %VAR% | $VAR | переменная окружения | | REM | # | комментарий | | NOT | ! | отрицание последующего условия | | NUL | /dev/null | "черная дыра" для того, чтобы "спрятать" вывод команды | | ECHO | echo | вывод (в Bash имеет большое число опций) | | ECHO. | echo | вывод пустой строки | | ECHO OFF | set +v | не выводить последующие команды | | FOR %%VAR IN (LIST) DO | for var in [list]; do | цикл "for" | | :LABEL | эквивалент отсутствует (нет необходимости) | метка | | GOTO | эквивалент отсутствует (используйте функции) | переход по заданной метке | | PAUSE | sleep | пауза, или ожидание, в течение заданного времени | | CHOICE | case или select | выбор из меню | | IF | if | условный оператор if | | IF EXIST FILENAME | if [ -e filename ] | проверка существования файла | | IF !%N==! | if [ -z "$N" ] | Проверка: параметр "N" отсутствует | | CALL | source или . (оператор "точка") | "подключение" другого сценария | | COMMAND /C | source или . (оператор "точка") | "подключение" другого сценария (то же, что и CALL) | | SET | export | установить переменную окружения | | SHIFT | shift | сдвиг списка аргументов уомандной строки влево | | SGN | -lt или -gt | знак (целого числа) | | ERRORLEVEL | $? | код завершения | | CON | stdin | "консоль" (stdin) | | PRN | /dev/lp0 | устройство принтера | | LPT1 | /dev/lp0 | устройство принтера | | COM1 | /dev/ttyS0 | первый последовательный порт |
Пакетные файлы обычно содержат вызовы команд DOS. Они должны быть заменены эквивалентными командами UNIX. Таблица H-2. Команды DOS и их эквиваленты в UNIX | Команды DOS | Эквивалент в UNIX | Описание |
|---|
| ASSIGN | ln | ссылка на файл или каталог | | ATTRIB | chmod | изменить атрибуты файла (права доступа) | | CD | cd | сменить каталог | | CHDIR | cd | сменить каталог | | CLS | clear | очистить экран | | COMP | diff, comm, cmp | сравнить файлы | | COPY | cp | скопировать файл | | Ctl-C | Ctl-C | прервать исполнение сценария | | Ctl-Z | Ctl-D | EOF (конец-файла) | | DEL | rm | удалить файл(ы) | | DELTREE | rm -rf | удалить каталог с подкаталогами | | DIR | ls -l | вывести содержимое каталога | | ERASE | rm | удалить файл(ы) | | EXIT | exit | завершить текущий процесс | | FC | comm, cmp | сравнить файлы | | FIND | grep | найти строку в файлах | | MD | mkdir | создать каталог | | MKDIR | mkdir | создать каталог | | MORE | more | постраничный вывод | | MOVE | mv | переместить | | PATH | $PATH | путь поиска исполняемых файлов | | REN | mv | переименовать (переместить) | | RENAME | mv | переименовать (переместить) | | RD | rmdir | удалить каталог | | RMDIR | rmdir | удалить каталог | | SORT | sort | отсортировать файл | | TIME | date | вывести системное время | | TYPE | cat | вывести содержимое файла на stdout | | XCOPY | cp | (расширенная команда) скопировать файл |
Фактически, команды и операторы командной оболочки UNIX имеют огромное количество дополнительных опций, расширяющих их функциональность, по сравнению с их эквивалентами в DOS. В большинстве своем, пакетные файлы DOS предполагают наличие вспомогательных утилит, таких как ask.com ("увечный" аналог UNIX-вого read).
DOS поддерживает крайне ограниченный набор шаблонных символов, учавствующих в операциях подстановки имен файлов, распознавая только два символа -- * и ?. Преобразование пакетных файлов DOS в сценарии командной оболочки, обычно не вызывает затруднений, а результат такого преобразования читается гораздо лучше, чем оригинал. Пример H-1. VIEWDATA.BAT: пакетный файл DOSREM VIEWDATA
REM INSPIRED BY AN EXAMPLE IN "DOS POWERTOOLS" REM BY PAUL SOMERSON
@ECHO OFF
IF !%1==! GOTO VIEWDATA REM IF NO COMMAND-LINE ARG... FIND "%1" C:\BOZO\BOOKLIST.TXT GOTO EXIT0 REM PRINT LINE WITH STRING MATCH, THEN EXIT.
:VIEWDATA TYPE C:\BOZO\BOOKLIST.TXT | MORE REM SHOW ENTIRE FILE, 1 PAGE AT A TIME.
:EXIT0 Результат преобразования в сценарий командной оболочки, немного улучшенный. Пример H-2. viewdata.sh: Результат преобразования VIEWDATA.BAT в сценарий командной оболочки#!/bin/bash # Результат преобразования пакетного файла VIEWDATA.BAT в сценарий командной оболочки.
DATAFILE=/home/bozo/datafiles/book-collection.data ARGNO=1
# @ECHO OFF Эта команда здесь не нужна.
if [ $# -lt "$ARGNO" ] # IF !%1==! GOTO VIEWDATA then less $DATAFILE # TYPE C:\MYDIR\BOOKLIST.TXT | MORE else grep "$1" $DATAFILE # FIND "%1" C:\MYDIR\BOOKLIST.TXT fi
exit 0 # :EXIT0
# операторы перехода GOTO, метки и прочий "мусор" больше не нужны. # Результат преобразования стал короче, чище и понятнее, На сайте Тэда Дэвиса (Ted Davis) Shell Scripts on the PC, вы найдете большое число руководств по созданию пакетных файлов в DOS. Определенно, его изобретательность будет вам полезна, при создании ваших сценариев.
|