至關多的在PC上學習腳本的程序員都在運行DOS. 事實上, 殘廢的DOS批處理文件語言仍是能夠編寫出一些比較強大的腳原本的, 雖然它們通常都須要藉助於外部的工具. 因此說, 某些時候, 咱們仍是須要將老式的DOS批處理文件轉換爲UNIX shell腳本. 通常來講, 作這種事情並不困難, 由於DOS批處理文件操做不過是等價的shell腳本的一個受限子集. html
表格 L-1. 批處理文件關鍵字 / 變量 / 操做符, 和等價的shell符號 linux
批處理文件操做符 | 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 or select | 菜單選擇 |
IF | if | if條件語句 |
IF EXIST FILENAME | if [ -e filename ] | 測試文件是否存在 |
IF !%N==! | if [ -z "$N" ] | 參數"N"是否存在 |
CALL | source命令或.(點操做符) | "include"另外一個腳本 |
COMMAND /C | source命令或.(點操做符) | "include"另外一個腳本(與CALL相同) |
SET | export | 設置一個環境變量 |
SHIFT | shift | 左移命令行參數列表 |
SGN | -lt或-gt | (整形)符號 |
ERRORLEVEL | $? | 退出狀態 |
CON | stdin | "控制檯"(stdin) |
PRN | /dev/lp0 | (通常的)打印設備 |
LPT1 | /dev/lp0 | 第一個打印設備 |
COM1 | /dev/ttyS0 | 第一個串口 |
批處理文件通常都包含DOS命令. 咱們必須把它轉換爲UNIX的等價命令, 這樣咱們才能把批處理文件轉換爲shell腳本文件. 程序員
表格 L-2. DOS命令與UNIX的等價命令 shell
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和shell操做符, 還有命令都有許多的選項, 對比DOS和批處理文件來講, 它們要強大的多. 許多DOS批處理文件都須要依靠輔助工具, 好比ask.com, 這是一個比read命令差不少的相似副本. 編程 DOS對於文件名通配符擴展支持的很是有限, 而且很不完整, 僅僅識別*和?. bash |
將DOS批處理文件轉換爲sehll腳本, 一般是一件很簡單的事情, 並且轉換的結果一般都比原始的批處理文件好. less
例子 L-1. VIEWDATA.BAT: DOS批處理文件 ide
1 REM VIEWDATA 2 3 REM 靈感來自於例子"DOS POWERTOOLS" 4 REM PAUL SOMERSON編寫 5 6 7 @ECHO OFF 8 9 IF !%1==! GOTO VIEWDATA 10 REM 若是沒有命令行參數... 11 FIND "%1" C:\BOZO\BOOKLIST.TXT 12 GOTO EXIT0 13 REM 打印出字符串匹配的行, 而後退出. 14 15 :VIEWDATA 16 TYPE C:\BOZO\BOOKLIST.TXT | MORE 17 REM 顯示整個文件, 一次一頁. 18 19 :EXIT0 |
轉換腳本做了一些改進. 函數
例子 L-2. viewdata.sh: 轉換自VIEWDATA.BAT的shell腳本 工具
1 #!/bin/bash 2 # viewdata.sh 3 # 轉換自VIEWDATA.BAT的shell腳本. 4 5 DATAFILE=/home/bozo/datafiles/book-collection.data 6 ARGNO=1 7 8 # @ECHO OFF 這個命令在這裏就不須要了. 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 # 跳轉, 標籤, 還有其餘一些小手段, 在shell腳本中就不須要了. 20 # 咱們能夠說, 轉換後的腳本比原始批處理文件好的多, 21 #+ 它更短, 看起來更整潔, 更優雅. |
Ted Davis的Shell Scripts on the PC站點上有許多關於老式的批處理文件編程的教程, 他使用的某些首創性的技術, 和shell腳本有殊途同歸之妙.