Преобразование пакетных (*.bat) файлов DOS в сценарии командной оболочки

Приложение J. Преобразование пакетных (*.bat) файлов DOS в сценарии командной оболочки

Большое число программистов начинало изучать скриптовые языки на PC, работающих под управлением DOS. Даже на этом "калеке" удавалось создавать неплохие сценарии, хотя это и требовало значительных усилий. Иногда еще возникает потребность в переносе пекетных файлов DOS на платформу Unix, в виде сценариев командной оболочки. Обычно это не сложно, поскольку набор операторов, доступных в DOS, представляет из себя ограниченное подмножество эквивалентных команд, доступных в командной оболочке.

Таблица J-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.

Таблица J-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 (расширенная команда) скопировать файл
Note

Фактически, команды и операторы командной оболочки Unix имеют огромное количество дополнительных опций, расширяющих их функциональность, по сравнению с их эквивалентами в DOS. В большинстве своем, пакетные файлы DOS предполагают наличие вспомогательных утилит, таких как ask.com ("увечный" аналог Unix-вого read).

DOS поддерживает крайне ограниченный набор шаблонных символов, учавствующих в операциях подстановки имен файлов, распознавая только два символа -- * и ?.

Преобразование пакетных файлов DOS в сценарии командной оболочки, обычно не вызывает затруднений, а результат такого преобразования читается гораздо лучше, чем оригинал.

Пример J-1. VIEWDATA.BAT: пакетный файл DOS

REM 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

Результат преобразования в сценарий командной оболочки, немного улучшенный.

Пример J-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. Определенно, его изобретательность будет вам полезна, при создании ваших сценариев.