如何編寫一個優雅的Shell指令碼(一)
阿新 • • 發佈:2018-12-19
簡介
shell指令碼是用各類命令預先放入到一個檔案中,方便一次性執行的一個程式檔案,本文簡述如何編寫一個優雅的shell指令碼。
使用技術介紹
eval命令
可以將一個字串當作一個命令執行。
CMD="ls -ltr"
eval $CMD
內建引數變數
$$
獲取當前程式程序ID。
$#
獲取當前程式傳入的引數個數,可以使用該內建變數對程式引數做判斷。
$?
獲取上一個命令執行返回的結果碼,結果碼等於0表示上一個命令執行成功,其他表示命令執行失敗。
echo
將內容輸出到終端的命令,再shell腳本里面,使用該命令常常用於日誌的列印和輸出終端的控制。可以使用>和>>來重定向到其他檔案裡。
echo "這裡是我要輸出檔案的內容"
echo "我可以把輸出內容以覆蓋的方式重定向到檔案裡面" > 檔案
echo "我可以把輸出內容以追加的方式重定向到檔案裡面" >> 檔案
關於重定向
上面echo已經講過重定向的兩個操作符>和>>,預設情況下這兩個操作符只對標準輸出(stdout)。在 shell 程式中,最常使用的 FD (file descriptor) 大概有三個, 分別是:
0 是一個檔案描述符,表示標準輸入(stdin) 1 是一個檔案描述符,表示標準輸出(stdout) 2 是一個檔案描述符,表示標準錯誤(stderr)
如果要捕獲錯誤輸出,需要做如下修改
echo "預設標準輸出" > 檔案
echo "功能和以上命令一樣" 1> 檔案
echo "標準輸出和錯誤輸出都捕獲到" 1>&2 檔案
除了>和>>可以重定向意外,還有一個命令可以重定向輸出到檔案中,它就是tee。
#無引數 echo "只輸出到標準輸出,因為沒有指定檔案嘛。" | tee #帶檔案引數 echo "輸出到標準輸出的同時,儲存到檔案file中。如果檔案不存在,則建立;如果已經存在,則覆蓋之"|tee file #tee -a 選項 echo "輸出到標準輸出的同時,追加到檔案file中。如果檔案不存在,則建立;如果已經存在,就在末尾追加內容,而不是覆蓋。"|tee -a file #tee - 選項 echo "輸出到標準輸出兩次。"|tee - # 輸出到標準輸出兩次,同時輸出到檔案 echo "輸出到標準輸出兩次,同時儲存到file1和file2中。"|tee file1 file2 -
自定義函式
#語法,與java和c++不同,函式的引數不需要寫在括號裡面,引數通過內建變數,$1,$2
function function_name() {
#引數1 $1
#引數2 $2
...
}
執行方式
- 最普通和常用的指令碼執行方式
sh /path/program.sh
- 有執行許可權的指令碼,也可以使用以下方式執行
/path/programe.sh
- 當前會話方式執行
#當前會話執行方式有兩種
. /path/program.sh
source /path/program.sh
當前回鶻執行方式與其他兩種執行效果略有不同,
- 以上兩種是新開一個程序去執行指令碼程式,指令碼執行完後,裡面的變數和函式也跟著被銷燬。
- 當前會話方式執行,執行完後,指令碼程式裡面的變數和函式儲存在當前會話,當前會話可以訪問指令碼程式裡面的一切。它的變數和函式的生命週期和當前會話共存亡。