将DOS批处理文件转换为Shell脚本
相當多的在PC上學習腳本的程序員都在運行DOS. 事實上, 殘廢的DOS批處理文件語言還是可以編寫出一些比較強大的腳本來的, 雖然它們一般都需要借助于外部的工具. 所以說, 某些時候, 我們還是需要將老式的DOS批處理文件轉換為UNIX shell腳本. 一般來說, 做這種事情并不困難, 因為DOS批處理文件操作不過是等價的shell腳本的一個受限子集.
表格 L-1. 批處理文件關鍵字 / 變量 / 操作符, 和等價的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的等價命令
| 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對于文件名通配符擴展支持的非常有限, 并且很不完整, 僅僅識別*和?. |
將DOS批處理文件轉換為sehll腳本, 通常是一件很簡單的事情, 而且轉換的結果通常都比原始的批處理文件好.?
例子 L-1. VIEWDATA.BAT: DOS批處理文件
| 1 REM VIEWDATA2 3 REM 靈感來自于例子"DOS POWERTOOLS"4 REM PAUL SOMERSON編寫5 6 7 @ECHO OFF8 9 IF !%1==! GOTO VIEWDATA10 REM 如果沒有命令行參數...11 FIND "%1" C:\BOZO\BOOKLIST.TXT12 GOTO EXIT013 REM 打印出字符串匹配的行, 然后退出. 14 15 :VIEWDATA16 TYPE C:\BOZO\BOOKLIST.TXT | MORE17 REM 顯示整個文件, 一次一頁. 18 19 :EXIT0 |
轉換腳本作了一些改進.?
例子 L-2. viewdata.sh: 轉換自VIEWDATA.BAT的shell腳本
| 1 #!/bin/bash2 # viewdata.sh3 # 轉換自VIEWDATA.BAT的shell腳本. 4 5 DATAFILE=/home/bozo/datafiles/book-collection.data6 ARGNO=17 8 # @ECHO OFF 這個命令在這里就不需要了. 9 10 if [ $# -lt "$ARGNO" ] # IF !%1==! GOTO VIEWDATA11 then12 less $DATAFILE # TYPE C:\MYDIR\BOOKLIST.TXT | MORE13 else14 grep "$1" $DATAFILE # FIND "%1" C:\MYDIR\BOOKLIST.TXT15 fi 16 17 exit 0 # :EXIT018 19 # 跳轉, 標簽, 還有其他一些小手段, 在shell腳本中就不需要了. 20 # 我們可以說, 轉換后的腳本比原始批處理文件好的多, 21 #+ 它更短, 看起來更整潔, 更優雅. |
Ted Davis的Shell Scripts on the PC站點上有許多關于老式的批處理文件編程的教程, 他使用的某些獨創性的技術, 和shell腳本有異曲同工之妙.
總結
以上是生活随笔為你收集整理的将DOS批处理文件转换为Shell脚本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jar包 热加载/卸载 的初步实现
- 下一篇: Js提交表单的两种方法