| Advanced Bash-Scripting Guide: Искусство программирования на языке сценариев командной оболочки; Версия 2.5 (15 февраля 2004) | ||
|---|---|---|
| Назад | Вперед | |
Большое число программистов начинало изучать скриптовые языки на 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 | (расширенная команда) скопировать файл |
![]() |
Фактически, команды и операторы командной оболочки 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. Определенно, его изобретательность будет вам полезна, при создании ваших сценариев.
| Назад | В начало документа | Вперед |
| Пример файла .bashrc | Упражнения |