Конвертация DOS/Windows batch-файлов в *nix shell-скрипты и обратно
Многие программисты постигали азы скриптового программирования создавая batch-скрипты под DOS. Позже вестма похожие скрипты стали делаться и для Windows. Несмотря на то, что язык batch-сценариев в DOS очень беден, сделать можно было довольно много полезного. И часть этого иногда хочется перенести под *nix (а бывает, что и наоборот). В целом процесс переноса не очень сложен.
Таблица соответствий ключевых слов, переменных и операторов
| Оператор batch-скрипта | Аналог в shell | Значение |
| % | $ | префикс параметра командной строки |
| / | - | флаг опции команды |
| \ | / | разделитель пути |
| == | = | (равно) сравнение строк |
| !==! | != | (не равно) сравнение строк |
| | | | | конвейер |
| @ | 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 или . (точка) | аналог "include" - "включение" другого скрипта |
| COMMAND /C | source bkb . (точка) | "включение" другого скрипта (то же, что CALL) |
| SET | export | установка значения переменной окружения |
| SHIFT | shift | "сдвинуть" влево параметры командной строки |
| SGN | -lt или -gt | знак (integer) |
| ERRORLEVEL | $? | статус выхода |
| CON | stdin | "консоль" (stdin) |
| PRN | /dev/lp0 | (стандартное) устройство печати |
| LPT1 | /dev/lp0 | первый принтер |
| COM1 | /dev/ttyS0 | первый serial port |
Команды DOS и их эквиваленты в *nix
Batch-файлы обычно содержат команды DOS. Их также необходимо корректно перенести под *nix.
| Команда DOS | Эквивалент в *nix | Значение |
| ASSIGN | ln | сделать линк на файл или каталог |
| ATTRIB | chmod | поменять права на файл |
| CD | cd | сменить каталог |
| CHDIR | cd | сменить каталог |
| CLS | clear | очистить экран |
| COMP | diff, comm, cmp | сравнение файлов |
| COPY | cp | копирование файлов |
| Ctl-C | Ctl-C | break (сигнал) |
| Ctl-Z | Ctl-D | EOF (end-of-file) |
| 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 | путь к исполняемым файламs |
| REN | mv | переименование (перемещение) |
| RENAME | mv | переименование (перемещение) |
| RD | rmdir | удаление каталогов |
| RMDIR | rmdir | удаление каталогов |
| SORT | sort | сортировка файла |
| TIME | date | показ системного времени |
| TYPE | cat | вывод файла в stdout |
| XCOPY | cp | (расширенное) копирование файла |
В целом операторы *nix shell значительно совершеннее своих аналогов в DOS. Кроме того, DOS поддерживает очень ограниченное число масок файлов (точнее, только * и ?). Таким образом, конвертация DOS batch-скрипта в shell-скрипт невольно приводит у повышению качества скрипта.
Пример
VIEWDATA.BAT: DOS Batch-файл
-
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
Ниже приводится переделанный скрипт, несколько лучший чем оригинальный.
viewdata.sh: VIEWDATA.BAT, преобразованный в shell-скрипт
-
#!/bin/bash
-
# viewdata.sh
-
# Conversion of VIEWDATA.BAT to shell script.
-
-
DATAFILE=/home/bozo/datafiles/book-collection.data
-
ARGNO=1
-
-
# @ECHO OFF Command unnecessary here.
-
-
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
-
-
# GOTOs, labels, smoke-and-mirrors, and flimflam unnecessary.
-
# The converted script is short, sweet, and clean,
-
#+ which is more than can be said for the original.
Оригинальный текст (на английском)

