1. 程式人生 > >如何編寫一個優雅的Shell指令碼(一)

如何編寫一個優雅的Shell指令碼(一)

簡介

   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)    是一個檔案描述符,表示標準錯誤(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

當前回鶻執行方式與其他兩種執行效果略有不同,

  1. 以上兩種是新開一個程序去執行指令碼程式,指令碼執行完後,裡面的變數和函式也跟著被銷燬。
  2. 當前會話方式執行,執行完後,指令碼程式裡面的變數和函式儲存在當前會話,當前會話可以訪問指令碼程式裡面的一切。它的變數和函式的生命週期和當前會話共存亡。