This Might Be Useful

Конвертация 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-файл

CODE:
  1. REM VIEWDATA
  2.  
  3. REM INSPIRED BY AN EXAMPLE IN "DOS POWERTOOLS"
  4. REM                           BY PAUL SOMERSON
  5.  
  6.  
  7. @ECHO OFF
  8.  
  9. IF !%1==! GOTO VIEWDATA
  10. REM  IF NO COMMAND-LINE ARG...
  11. FIND "%1" C:\BOZO\BOOKLIST.TXT
  12. GOTO EXIT0
  13. REM  PRINT LINE WITH STRING MATCH, THEN EXIT.
  14.  
  15. :VIEWDATA
  16. TYPE C:\BOZO\BOOKLIST.TXT | MORE
  17. REM  SHOW ENTIRE FILE, 1 PAGE AT A TIME.
  18.  
  19. :EXIT0

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

viewdata.sh: VIEWDATA.BAT, преобразованный в shell-скрипт

CODE:
  1. #!/bin/bash
  2. # viewdata.sh
  3. # Conversion of VIEWDATA.BAT to shell script.
  4.  
  5. DATAFILE=/home/bozo/datafiles/book-collection.data
  6. ARGNO=1
  7.  
  8. # @ECHO OFF                 Command unnecessary here.
  9.  
  10. if [ $# -lt "$ARGNO" ]    # IF !%1==! GOTO VIEWDATA
  11. then
  12.   less $DATAFILE          # TYPE C:\MYDIR\BOOKLIST.TXT | MORE
  13. else
  14.   grep "$1" $DATAFILE     # FIND "%1" C:\MYDIR\BOOKLIST.TXT
  15. fi 
  16.  
  17. exit 0                    # :EXIT0
  18.  
  19. #  GOTOs, labels, smoke-and-mirrors, and flimflam unnecessary.
  20. #  The converted script is short, sweet, and clean,
  21. #+ which is more than can be said for the original.

Оригинальный текст (на английском)

· Отключение автоматического определения типа папки
· Сброс визуальных настроек Windows Explorer
· Удаление истории Internet Explorer 7
· Добавление папок в контекстное меню Send To
· Сборка MySQL, Apache и PHP со всеми необходимыми расширениями

- Коментировать
- Trackback

Leave a Reply