歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

將DOS批處理文件轉換為Shell腳本

相當多的在PC上學習腳本的程序員都在運行DOS. 事實上, 殘廢的DOS批處理文件語言還是可以編寫出一些比較強大的腳本來的, 雖然它們一般都需要借助於外部的工具. 所以說, 某些時候, 我們還是需要將老式的DOS批處理文件轉換為UNIX shell腳本. 一般來說, 做這種事情並不困難, 因為DOS批處理文件操作不過是等價的shell腳本的一個受限子集.

表格 L-1. 批處理文件關鍵字 / 變量 / 操作符, 和等價的shell符號

批處理文件操作符 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的等價命令

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 (擴展的)文件拷貝

--------------------------------------------------------------------------------


Note 事實上, 幾乎所有的UNIX和shell操作符, 還有命令都有許多的選項, 對比DOS和批處理文件來說, 它們要強大的多. 許多DOS批處理文件都需要依靠輔助工具, 比如ask.com, 這是一個比read命令差很多的類似副本.

DOS對於文件名通配符擴展支持的非常有限, 並且很不完整, 僅僅識別*和?.
 

將DOS批處理文件轉換為sehll腳本, 通常是一件很簡單的事情, 而且轉換的結果通常都比原始的批處理文件好.


--------------------------------------------------------------------------------

例子 L-1. VIEWDATA.BAT: DOS批處理文件

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腳本有異曲同工之妙.
 

Copyright © Linux教程網 All Rights Reserved