SHELL編程入門 ØShell基礎Ø流程式控制制文法Ø常用命令介紹Ø範例展示Ø技巧總結 }解決介面無法處理的問題}}命令列介面比較快}做好管理 }bsh (Bourne Shell)}ksh (Korn Shell)}csh ( C Shell)}最常用的Shell是sh,大部分的Unix系統都將sh串連到bsh;IBM將sh串連到ksh }Shell程式也就是一系列的Unix命令的組合,相當於DOS系統下的批處理命令。Unix命令既可以是內部命令,也可以是已經編譯好的進階語言程式,甚至可以是其它Shell程式}Shell程式支援分支與迴圈結構,可以進行訊號處理}Shell程式可以加註釋,注釋以“#”號開頭,到行尾結束 }怎樣才能知道用什麼Shell來執行我編寫的Shell指令碼?參照下面三個原則:◦如果指令檔的第一個字元不是“#”號,則啟動bsh執行此指令碼◦如果指令檔的第一個字元是“#”號,但第二個字元不是“!”,則啟動csh執行此指令碼◦如果指令檔的前兩個字元為“#!”,則後面必須是Shell的全路徑,啟動指定的Shell執行此指令碼,如: #!/usr/bin/ksh }Shell中if語句的文法如下:}if 命令1 #如果命令1執行成功(返回0)}then #則執行list1命令列表} list1 #如果執行不成功(返回非0值)}elif 命令2 #執行命令2}then #如果命令2執行成功} list2 #則執行list2命令列表}else #如果命令2執行不成功} list3 #則執行list3命令列表}fi}if語句以fi結尾 }Shell中case語句的文法如下:}case word in #如果word與 pattern1匹配,} pattern1) #則執行list1命令列表} list1 #如果word與 pattern2匹配,} ;; #則執行list2命令列表} pattern2) #…………} list2} ;;} …………}esac }case語句以esac結尾,每個分支後兩個“;”是必須的}case語句中的pattern可以使用如下結構}“或”結構,如“a|b|c”匹配a或b或c}[範圍],如“[0-9]”匹配單個數字}“?”匹配任何單個字元}“*”匹配任何零個或多個字元}使用“*”,相當於C語言default分支}以上結構可以組合使用,如:}“[0-9]|0x[0-9A-Fa-f]” }Shell中while迴圈的文法如下:}while command}do} list}done #迴圈語句必須以done結尾}1、執行命令command}2、如果執行成功(傳回值為0),} 則執行list命令列表}3、重複1,直至command命令失敗(返回非零值) }Shell中until迴圈的文法如下:}until command}do} list}done #迴圈語句必須以done結尾}1、執行命令command}2、如果執行失敗(傳回值非0),} 則執行list命令列表}3、重複1,直至command命令執行成功(返回0) }Shell中for迴圈的文法如下:}for name in word1 word2 ... wordN}do} list}done #迴圈語句必須以done結尾}name為變數名,word1到wordN是由空格分開的單字清單}for迴圈每次執行時,變數name被設為列表中的下一單詞}for迴圈常用於處理檔案集合 }例如:修改一個目錄下所有檔案的檔案名稱,在檔案名稱後加上“.bak”}for file in $HOME/*}do} mv $file ${file}.bak}done }Shell中的特殊字元}* ? [ ] ' " \ $ ; & ( ) | ^ < > 換行 空格 tab}單引號“'”:單引號內的所有特殊字元都失去其特殊含義,包括分行符號}“'”必須成對出現。一對“'”之間不能嵌入“'”,前面用“\”轉義也不可以}反引號“`”:反引號內是一組命令。Shell將反引號替換為該命令的輸出。反引號對特殊字元的處理與雙引號基本相同 }雙引號“"”:雙引號內的大部分字元失去特殊含義,下面的字元除外:◦$ $用於變數替換◦` 反引號用於命令替換◦\$ $作為美元符,而不具備特殊含義◦\` `作為反引號,而不具備特殊含義◦\" 使用嵌入的雙引號◦\\ 使用嵌入的反斜線◦其它的\字元都作為一般字元 }定義變數name=value 中間不能有空白 變數名只能包含字母、數字或者底線,並且只能以字母或底線開頭 }引用變數時,在變數名前加 $符}特殊的變數◦$$ 當前執行Shell的進程ID◦$1 … $9 命令列參數◦$@或$* 命令列參數◦環境變數:子進程可以繼承父進程的環境變數,在sh下,用export命令將一個變數設為環境變數}在ksh中,${#name} 為變數name值的長度 }command > filename 把把標準輸出重新導向到一個新檔案中}command >> filename 把把標準輸出重新導向到一個檔案中(追加)}command 1 > fielname 把把標準輸出重新導向到一個檔案中}command > filename 2>&1 把把標準輸出和標準錯誤一起重新導向到一個檔案中}command 2 > filename 把把標準錯誤重新導向到一個檔案中}command 2 >> filename 把把標準輸出重新導向到一個檔案中(追加)}command >> filename 2>&1 把把標準輸出和標準錯誤一起重新導向到一個檔案中(追加)}command < filename >filename2 把command命令以filename檔案作為標準輸入,以filename2檔案作為標準輸出}command < filename 把c o m m a n d命令以f i l e n a m e檔案作為標準輸入}command << delimiter 把從標準輸入中讀入,直至遇到d e l i m i t e r分界符}command <&m 把把檔案描述符m作為標準輸入}command >&m 把把標準輸出重新導向到檔案描述符m中}command <&- 把關閉標準輸入} 1、在命令列中指定偵錯模式執行 }指定SHELL –x 程式名稱,如:}sh –x update_iuser214.sh}2、 執行SHELL }前台執行:} >sh 程式名稱} >程式名稱}後台執行:} >sh 程式名稱 &} >程式名稱 &} }尋找和編輯文本,主要用於按指定模式尋找,替換,插入,刪除檔案內容}直接鍵入命令}Sed [-option] command_line filename}將sed命令插入指令檔,然後調用sed}Sed [-option] –f program_file filename}選項:}e 使用命令列作為sed的編輯命令}n 不列印 命令 意思 P 列印匹配行 = 顯示文本行號 a\ 在定位行號後附加新文本資訊 i\ 在定位行號前插入新文本資訊 d 刪除定位行 c\ 用新文本替換定位文本 s 使用替換模式 r 從一個檔案中讀文本 w 將文本寫到一個檔案 Sed列印檔案的第二行 sed –n ‘2p’ filename Sed列印匹配test的行 sed –n ‘/test/p’ filename Sed替換文本 sed ‘s/night/NIGHT’ filename sed ‘s/night/NIGHT/g’ filename 刪除僅包含空行的行 sed ‘/^[]*$d’ filename Awk是一種程式語言,對於文檔裡的資料做修改、比較、抽取等處理 格式: awk [-F char] ‘command_line’ filename -F char 確定間隔符 刪除偶數行 awk ‘{if(NR%2==1) print $0}’ filename 擷取輸入行中域最大的數 awk ‘{if(NF>max) max=NF} END {print max}’ filename 輸出超過80個字元的行 awk ‘{length($0)>80 }’ filename 良好的注釋能夠增加代碼可讀性 指令碼執行與定義分離,增強代碼可擴充性 }理解需求,需要對外提供什麼樣的介面}將需求分解成小步驟}增加必要的注釋}區分變數的使用,全域變數與局部變數的使用}寫虛擬碼,提取出共性部分使用函數實現}逐步實現小需求,逐步調試}盡量使用變數,提供可擴充性,保證指令碼後續的維護}減少頻繁對外的互動