shell是操作linux的基本,是必須學的。學shell就是學linux命令。perl有強大的Regex支援,對於文本處理非常強悍,玩linux不得不學。python作用一種物件導向的,能作為linux指令碼的語言,學好之後能幫你很好地完成工作。
shell翻譯成殼的意思,它是包裹在linux核心外層的,一個可通過一系列的linux命令對作業系統發出相關指令的人機介面。 shell可以通過其條件陳述式和迴圈語句等,把一系列linux命令結合在一起,形成一個相當於面向過程的程式,shell script,來實現一些較為複雜的功能。總括,shell是linux命令集的概稱,是屬於命令列的人機介面
shell指令碼在linux系統管理員的營運工作中非常非常重要。下面筆者就帶你正式進入shell指令碼的世界吧。
到現在為止,你明白什麼是shell指令碼嗎。如果明白最好了,不明白也沒有關係,相信隨著學習的深入你就會越來越瞭解到底什麼是shell指令碼。首先它是一個指令碼,並不能作為正式的程式設計語言。因為是跑在linux的shell中,所以叫shell指令碼。說白了,shell指令碼就是一些命令的集合。舉個例子,我想實現這樣的操作:1)進入到/tmp/目錄;2)列出目前的目錄中所有的檔案名稱;3)把所有當前的檔案拷貝到/root/目錄下;4)刪除目前的目錄下所有的檔案。簡單的4步在shell視窗中需要你敲4次命令,按4次斷行符號。這樣是不是很麻煩。當然這4步操作非常簡單,如果是更加複雜的命令設定需要幾十次操作呢。那樣的話一次一次敲鍵盤會很麻煩。所以不妨把所有的操作都記錄到一個文檔中,然後去調用文檔中的命令,這樣一步操作就可以完成。其實這個文檔呢就是shell指令碼了,只是這個shell指令碼有它特殊的格式。
Shell指令碼能協助我們很方便的去管理伺服器,因為我們可以指定一個任務計劃定時去執行某一個shell指令碼實現我們想要需求。這對於linux系統管理員來說是一件非常值得自豪的事情。現在的139郵箱很好用,發郵件的同時還可以發一條郵件通知的簡訊給使用者,利用這點,我們就可以在我們的linux伺服器上部署監控的shell指令碼,比如網卡流量有異常了或者伺服器web伺服器停止了就可以發一封郵件給管理員,同時發送給管理員一個警示簡訊這樣可以讓我們及時的知道伺服器出問題了。
有一個問題需要約定一下,凡是自訂的指令碼建議放到/usr/local/sbin/目錄下,這樣做的目的是,一來可以更好的管理文檔;二來以後接管你的管理員都知道自訂指令碼放在哪裡,方便維護。
【shell指令碼的基本結構以及如何執行】
Shell指令碼通常都是以.sh 為尾碼名的,這個並不是說不帶.sh這個指令碼就不能執行,只是大家的一個習慣而已。所以,以後你發現了.sh為尾碼的檔案那麼它一定會是一個shell指令碼了。test.sh中第一行一定是 “#! /bin/bash” 它代表的意思是,該檔案使用的是bash文法。如果不設定該行,那麼你的shell指令碼就不能被執行。’#’表示注釋,在前面講過的。後面跟一些該指令碼的相關注釋內容以及作者和建立日期或者版本等等。當然這些注釋並非必須的,如果你懶的很,可以省略掉,但是筆者不建議省略。因為隨著你工作時間的增加,你寫的shell指令碼也會越來越多,如果有一天你回頭查看你寫的某個指令碼時,很有可能忘記該指令碼是用來幹什麼的以及什麼時候寫的。所以寫上注釋是有必要的。另外系統管理員並非你一個,如果是其他管理員查看你的指令碼,他看不懂豈不是很鬱悶。該指令碼再往下面則為要啟動並執行命令了。
Shell指令碼的執行很簡單,直接”sh filename “ 即可,另外你還可以這樣執行
預設我們用vim編輯的文檔是不帶有執行許可權的,所以需要加一個執行許可權,那樣就可以直接使用’./filename’ 執行這個指令碼了。另外使用sh命令去執行一個shell指令碼的時候是可以加-x選項來查看這個指令碼執行過程的,這樣有利於我們調試這個指令碼哪裡出了問題。
該shell指令碼中用到了’date’這個命令,它的作用就是用來列印當前系統的時間。其實在shell指令碼中date使用率非常高。有幾個選項筆者常常在shell指令碼中用到:
%Y表示年,%m表示月,%d表示日期,%H表示小時,%M表示分鐘,%S表示秒
注意%y和%Y的區別。
-d 選項也是經常要用到的,它可以列印n天前或者n天后的日期,當然也可以列印n個月/年前或者後的日期。
另外星期幾也是常用的
【shell指令碼中的變數】
在shell指令碼中使用變數顯得我們的指令碼更加專業更像是一門語言,開個玩笑,變數的作用當然不是為了專業。如果你寫了一個長達1000行的shell指令碼,並且指令碼中出現了某一個命令或者路徑幾百次。突然你覺得路徑不對想換一下,那豈不是要更改幾百次。你固然可以使用批量替換的命令,但是也是很麻煩,並且指令碼顯得臃腫了很多。變數的作用就是用來解決這個問題的。
在test2.sh中使用到了反引號,你是否還記得它的作用。’d’和’d1’在指令碼中作為變數出現,定義變數的格式為 “變數名=變數的值”。當在指令碼中引用變數時需要加上’$’符號,這跟前面講的在shell中自訂變數是一致的。下面看看指令碼執行結果吧。
下面我們用shell計算兩個數的和。
數學計算要用’[ ]’括起來並且外頭要帶一個’$’。指令碼結果為:
Shell指令碼還可以和使用者互動。
這就用到了read命令了,它可以從標準輸入獲得變數的值,後跟變數名。”read x”表示x變數的值需要使用者通過鍵盤輸入得到。指令碼執行過程如下:
我們不妨加上-x選項再來看看這個執行過程:
在test4.sh中還有更加簡潔的方式。
read -p 選項類似echo的作用。執行如下:
你有沒有用過這樣的命令”/etc/init.d/iptables restart “ 前面的/etc/init.d/iptables 檔案其實就是一個shell指令碼,為什麼後面可以跟一個”restart”? 這裡就涉及到了shell指令碼的預設變數。實際上,shell指令碼在執行的時候後邊是可以跟變數的,而且還可以跟多個。不妨筆者寫一個指令碼,你就會明白了。
執行過程如下:
在指令碼中,你會不會奇怪,哪裡來的$1和$2,這其實就是shell指令碼的預設變數,其中$1的值就是在執行的時候輸入的1,而$2的值就是執行的時候輸入的$2,當然一個shell指令碼的預設變數是沒有限制的,這回你明白了吧。另外還有一個$0,不過它代表的是指令碼本身的名字。不妨把指令碼修改一下。
執行結果想必你也猜到了吧。
【shell指令碼中的邏輯判斷】
如果你學過C或者其他語言,相信你不會對if 陌生,在shell指令碼中我們同樣可以使用if邏輯判斷。在shell中if判斷的基本文法為:
1)不帶else
if 判斷語句; then
command
fi
在if1.sh中出現了 ((a<60))這樣的形式,這是shell指令碼中特有的格式,用一個小括弧或者不用都會報錯,請記住這個格式,即可。執行結果為:
2)帶有else
if 判斷語句 ; then
command
else
command
fi
執行結果為:
3)帶有elif
if&nbs