模仿DIR環境指令碼 很多電腦愛好者是從Unix或是Linux作業系統學起的,然而還有很多人是從別的系統學起的,使用不同的命令、不同類型的互動方式。比如說,很有可能你公司的員工更習慣於使用DOS命令,而不是一個shell的解提示器。使用一系列的alias可以稍微減少一點這種差異,比如說將dos命令映射城unix的ls命令: alias DIR=ls 但如果使用者學習過在dos下/w表示寬列表格式的話,這種映射就沒什麼效果了。因為unix命令會警告沒有/w目錄。取而代之,像之前寫的那些改變輸入的封裝器一樣,接下來的DIR指令碼就是用來映射一種類型命令選項到另一種環境中去。 代碼: 01#!/bin/sh02 03 # DIR.sh -- 假裝我們正使用DOS的dir命令04 # 使用dir命令顯示給定檔案的內容,該命令可接受標準的dir選項05 06 function usage07 {08 cat << EOF >&209 Usage: $(basename $0) [DOS flags] directory or directories10 where:11 /D sort by columns12 /H show help for this shell script13 /N show long listing format with filenames on right14 /OD sort by oldest to newest15 /O-D sort by newest to oldest16 /P pause after each screenful of information17 /Q show owner of the file18 /S recursive listing19 /W use wide listing format20 EOF21 exit 122 }23 24 postcmd=""25 flags=""26 27 while [ $# -gt 0 ]28 do29 case $1 in30 /D) flags="$flags -x";;31 /H) usage;;32 /[NQW]) flags="$flags -l";; # Regex33 /OD) flags="$flags -rt";;34 /O-D) flags="$flags -t";;35 /P) postcmd="more";;36 /S) flags="$flags -s";;37 *) break; # 未知選項:可能是一個檔案描述符;所以退出迴圈38 esac39 shift40 done41 42 if [ ! -z "$postcmd" ]; then43 ls $flags "$@" | $postcmd44 else45 ls $flags "$@"46 fi47 48 exit 0指令碼如何運行: 這個指令碼突出了一個真相:shell指令碼中的case語句事實上是Regex,這個特性非常有用。你可以看到在dos中的/N、/Q、/W選項都被映射到了unix中ls命令的-l選項上。 理論上使用者應當被授予unix環境中的文法和選項,但那並不一定是必須的。當然,在調用這個指令碼前可以查看指令碼中的協助選項來瞭解所有的映射選項。 運行指令碼: 將指令碼命名為DIR.sh,當使用者在命令列上鍵入典型的DOS命令選項時,就會產生一個有意義的輸出,而不是以前的那種錯誤資訊:command not found 運行結果: 01$ DIR /OD /S /Volumes/110GB/02 total 6068003 0 WEBSITES 64 Desktop DB04 0 Writing 0 Temporary Items05 0 Microsoft Office X 29648 Norton FS Volume 206 0 Documents 29648 Norton FS Volume07 0 TheVolumeSettingsFolder 0 iTunes Library08 0 Trash 8 Norton FS Index09 816 Norton FS Data 0 Desktop Folder10 496 Desktop DF 0 Desktop Picture Archive這個目錄下的排序方式是從最舊的到最新的,同時顯示了檔案大小。