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

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

至關多的在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腳本有殊途同歸之妙.

相關文章
相關標籤/搜索