介紹:
1 開頭
程序必須如下面的行開始(必須方在文件的第一行):
#!/bin/sh
符號#!用來告訴系統它後面的參數是用來執行該文件的程序。在這個例子中咱們使用/bin/sh來執行程序。
當編寫腳本完成時,若是要執行該腳本,還必須使其可執行。
要使編寫腳本可執行:
編譯 chmod +x filename 這樣才能用./filename 來運行
2 註釋
在進行shell編程時,
以#開頭的句子表示註釋,直到這一行的結束
。咱們真誠地建議您在程序中使用註釋。
若是您使用了註釋,那麼即便至關長的時間內沒有使用該腳本,您也能在很短的時間內明白該腳本的做用及工做原理。
3 變量
在其餘編程語言中您必須使用變量。在shell編程中,全部的變量都由字符串組成,而且您不須要對變量進行聲明。要賦值給一個變量,您能夠這樣寫:
#!/bin/sh
#對變量賦值:
a=」hello world」
# 如今打印變量a的內容:
echo 「A is:」
echo $a
有時候變量名很容易與其餘文字混淆,好比:
num=2
echo 「this is the $numnd」
這並不會打印出」this is the 2nd」,而僅僅打印」this is the 「,由於shell會去搜索變量numnd的值,可是這個變量時沒有值的。可使用花括號來告訴shell咱們要打印的是num變量:
num=2
echo 「this is the ${num}nd」
這將打印:
this is the 2nd
4 環境變量
由export關鍵字處理過的變量叫作環境變量。
咱們不對環境變量進行討論,由於一般狀況下僅僅在登陸腳本中使用環境變量。
5 Shell命令和流程控制
在shell腳本中可使用三類命令:
1)Unix 命令:
雖然在shell腳本中可使用任意的unix命令,可是仍是由一些相對更經常使用的命令。這些命令一般是用來進行文件和文字操做的。
經常使用命令語法及功能
echo 「some text」: 將文字內容打印在屏幕上
ls: 文件列表
wc –l filewc -w filewc -c file: 計算文件行數計算文件中的單詞數計算文件中的字符數
cp sourcefile destfile: 文件拷貝
mv oldname newname : 重命名文件或移動文件
rm file: 刪除文件
grep ‘pattern’ file: 在文件內搜索字符串好比:grep ’searchstring’ file.txt
cut -b colnum file: 指定欲顯示的文件內容範圍,並將它們輸出到標準輸出設備好比:輸出每行第5個到第9個字符cut -b5-9 file.txt千萬不要和cat命令混淆,
這是兩個徹底不一樣的命令
cat file.txt: 輸出文件內容到標準輸出設備(屏幕)上
file somefile: 獲得文件類型
read var: 提示用戶輸入,並將輸入賦值給變量
sort file.txt: 對file.txt文件中的行進行排序
uniq: 刪除文本文件中出現的行列好比: sort file.txt | uniq
expr: 進行數學運算Example: add 2 and 3expr 2 「+」 3
find: 搜索文件好比:根據文件名搜索find . -name filename -print
tee: 將數據輸出到標準輸出設備(屏幕) 和文件好比:somecommand | tee outfile
basename file: 返回不包含路徑的文件名好比: basename /bin/tux將返回 tux
dirname file: 返回文件所在路徑好比:dirname /bin/tux將返回 /bin
head file: 打印文本文件開頭幾行
tail file : 打印文本文件末尾幾行
sed: Sed是一個基本的查找替換程序。能夠從標準輸入(好比命令管道)讀入文本,並將
結果輸出到標準輸出(屏幕)。該命令採用正則表達式(見參考)進行搜索。不要和shell中的通配符相混淆。好比:將linuxfocus替換爲 LinuxFocus :cat text.file | sed ’s/linuxfocus/LinuxFocus/’ >newtext.fileawk: awk 用來從文本文件中提取字段。缺省地,字段分割符是空格,可使用-F指定其餘分割符。 catfile.txt | awk -F, ‘{print $1 「,」 $3}’這裏咱們使用,做爲字段分割符,同時打印第一個和第三個字段。若是該文件內容以下: Adam Bor, 34, IndiaKerryMiller, 22, USA命令輸出結果爲:Adam Bor, IndiaKerry Miller, USA 2) 概念: 管道, 重定向和 backtick 這些不是系統命令,可是他們真的很重要。 管道 (|) 將一個命令的輸出做爲另一個命令的輸入。 grep 「hello」 file.txt | wc -l 在file.txt中搜索包含有」hello」的行並計算其行數。 在這裏grep命令的輸出做爲wc命令的輸入。固然您可使用多個命令。 重定向:將命令的結果輸出到文件,而不是標準輸出(屏幕)。 > 寫入文件並覆蓋舊文件 >> 加到文件的尾部,保留舊文件內容。 反短斜線 使用反短斜線能夠將一個命令的輸出做爲另一個命令的一個命令行參數。 命令: find . -mtime -1 -type f -print 用來查找過去24小時(-mtime –2則表示過去48小時)內修改過的文件。若是您想將全部查找到的文件打一個包,則可使用如下linux 腳本: #!/bin/sh # The ticks are backticks (`) not normal quotes (‘): tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print` 3) 流程控制 1.if 「if」 表達式 若是條件爲真則執行then後面的部分: if ….; then …. elif ….; then …. else …. fi 大多數狀況下,可使用測試命令來對條件進行測試。好比能夠比較字符串、判斷文件是否存在及是否可讀等等… 一般用」 [ ] 「來表示條件測試。注意這裏的空格很重要。要確保方括號的空格。 [ -f "somefile" ] :判斷是不是一個文件 [ -x "/bin/ls" ] :判斷/bin/ls是否存在並有可執行權限 [ -n "$var" ] :判斷$var變量是否有值 [ "$a" = "$b" ] :判斷$a和$b是否相等 執行man test能夠查看全部測試表達式能夠比較和判斷的類型。 直接執行如下腳本: #!/bin/sh if [ "$SHELL" = "/bin/bash" ]; then echo 「your login shell is the bash (bourne again shell)」 else echo 「your login shell is not bash but $SHELL」 fi 變量$SHELL包含了登陸shell的名稱,咱們和/bin/bash進行了比較。 快捷操做符 熟悉C語言的朋友可能會很喜歡下面的表達式: [ -f "/etc/shadow" ] && echo 「This computer uses shadow passwors」 這裏 && 就是一個快捷操做符,若是左邊的表達式爲真則執行右邊的語句。 您也能夠認爲是邏輯運算中的與操做。上例中表示若是/etc/shadow文件存在則打印」 This computer uses shadow passwors」。一樣或操做(||)在shell編程中也是可用的。這裏有個例子: #!/bin/sh mailfolder=/var/spool/mail/james [ -r "$mailfolder" ]‘ ‘{ echo 「Can not read $mailfolder」 ; exit 1; } echo 「$mailfolder has mail from:」 grep 「^From 」 $mailfolder 該腳本首先判斷mailfolder是否可讀。若是可讀則打印該文件中的」From」 一行。若是不可讀則或操做生效,打印錯誤信息後腳本退出。這裏有個問題,那就是咱們必須有兩個命令: ◆打印錯誤信息 ◆退出程序 咱們使用花括號以匿名函數的形式將兩個命令放到一塊兒做爲一個命令使用。通常函數將在下文說起。 不用與和或操做符,咱們也能夠用if表達式做任何事情,可是使用與或操做符會更便利不少。