iredmail是一套以postfix為核心的整合郵件系統的安裝腳本,可以達到快速部署郵件服務器的目的。為了讓自己不遺忘shell的語法,所以閑來無事,學習一下他的代碼。
我從官網下載他的最新版,解壓后,結構如下:
iRedMail.sh 是開始安裝的啟動文件,執行bash iRedMail.sh 后就開始安裝,我們從這個文件看起。
tmPRootdir="$(dirname $0)"
dirname的用法是:
(1) 帶全路徑的,例:aguo@auto-test:~> dirname /home/aguo/insert.sql
/home/aguo #獲得文件所在目錄
(2) 僅僅是文件名的,例:aguo@auto-test:~> dirname Environment
. 表示路徑就是當前目錄
$0 在shell中的意思是當前執行腳本的名稱一個命令涉及了3個知識點,看來學習還是能加深印象的。
第二個命令如下:
echo ${tmprootdir} | grep '^/' >/dev/null 2>&1
| 管道符 ,管道符左邊命令的輸出就會作為管道符右邊命令的輸入。連續使用管道意味著第一個命令的輸出會作為 第二個命令的輸入,第二個命令的輸出又會作為第三個命令的輸入,依此類推。
grep ‘^/’ 查找以/開頭的,grep的正則表達式用法
>/dev/null 2>&1 :
可以將/dev/null看作"黑洞". 它非常等價于一個只寫文件. 所有寫入它的內容都會永遠丟失. 而嘗試從它那兒讀取內容則什么也讀不到
1 表示stdout標準輸出,系統默認值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr標準錯誤
& 表示等同于的意思,2>&1,表示2的輸出重定向等同于1
很多shell腳本里都會用到,實際作用就是不讓輸出任何內容
這個命令的整體作用就是為了查找變量tmprootdir的值中以/開頭的,下面會根據狀態碼進行判斷
if [ X"$?" == X"0" ]; then export ROOTDIR="${tmprootdir}"else export ROOTDIR="$(pwd)"fi
export export命令可以用來設置或顯示環境變量。在shell中,當一個變量創建時,只會在當前的shell中有 效,之后創建的子進程不會有該變量。而命令export可以將一個shell變量變成環境變量,在隨后創建的子進程中也能訪問到該環境變量,但是子進程在 修改了環境變量的值之后,父進程并不能知道,因為子進程將復制父進程的環境變量。因此,當shell退出時,那些在該shell中export出來的環境 變量也會消失。
這樣的話,接下來的腳本中,ROOTDIR的值就會保留下來
新聞熱點
疑難解答