shell有兩種執行命令的方式:
交互式(Interactive):解釋執行用戶的命令,用戶輸入一條命令,Shell就解釋執行一條。linux
批處理(Batch):用戶事先寫一個Shell腳本(Script),其中有不少條命令,讓Shell一次把這些命令執行完,而沒必要一條一條地敲命令。shell
咱們要知道bash和sh不是一個東西,咱們須要瞭解,bash徹底兼容sh,也就是說,用sh寫的腳本能夠不加修改的在bash中執行。小程序
來吧,開始寫shellbash
終端輸入 vi test.shless
開始編輯輸入一下內容:(其實在vi編輯器裏面輸入內容是最難的了!!!)編輯器
echo "Hi, SB"read PERSONecho "$PERSON, ni shi hou zi pai lai de dou bi ma ?"輸入完畢後,按Esc,而後輸入 wq,按enter好了已經保存而且退出了。(以上步驟若是還不夠熟練,建議你換個姿式~再來一次而且明白每一個步驟的做用)函數
接着運行,運行的話有好幾種方式,這裏用倆種吧工具
第一種,輸入 ./test.sh(注意!前面有個點,表示當前目錄下)測試
第二種,輸入 sh test.sh (固然bash test.sh也能夠啦,前面說了bash對sh兼容是很好的,固然我這裏不是看敲sh方便嘛,就倆個字符。(尼瑪!多敲倆個字符能死。。))spa
好了,看看結果。咦?怎麼不對。。。
Linux有個權限系統,咱們這樣建立的文件是沒有執行權限的,由於默認建立的文件權限是 -rw-r--r--,至於不瞭解這一出字符的意思,能夠暫時先無論,咱們在後面會講到。在執行以前須要給他加權限,命令行輸入 chmod +x ./test.sh,便可,這樣就增長了可執行權限。(偶爾我會簡單粗暴的chmod 777 ./test.sh,固然這不是什麼好方法~,這個和前面說的是有區別的哈,能夠經過 ls -l | grep test.sh 查看倆個賦予權限的區別),至於上面敘述的有疑問,能夠直接回復提問
好了,這下能夠運行咱們的程序了,敲入 ./test.sh 或 sh test.sh 運行,是否是有驚喜啊!竟然說出了「Hi SB」,緊接着我輸入了nima 而後後面的字符也就出來了。
變量概念
好了,第一個小程序運行成功了,接下來看看變量定義:
例子:varibleName="value"
首先有一點,變量名和等號之間不能有空格,這點千萬注意,由於咱們平時寫其餘程序的時候可能已經養成了這種習慣,在shell這裏須要注意這個習慣,
而後要知道的一些變量命名規則:
1,首個字符必須爲字母(a-z,A-Z)。
2,中間不能有空格,可使用下劃線(_)。
3,不能使用標點符號。
4,不能使用bash裏的關鍵字(可用help命令查看保留關鍵字)。
定義好變量咱們就要開始使用變量了,如何使用變量,須要在本身定義的變量名上加上大括號,而後最前面寫上$字符,例如
who="dog"
echo who is ${who}?
其實變量能夠直接用$who取,可是爲了養成好習慣,仍是加上括號吧。
接着咱們對shell的變量類型作個瞭解,有三種變量:
1 局部變量
局部變量在腳本或命令中定義,僅在當前shell實例中有效,其餘shell啓動的程序不能訪問局部變量。2 環境變量
全部的程序,包括shell啓動的程序,都能訪問環境變量,有些程序須要環境變量來保證其正常運行。必要的時候shell腳本也能夠定義環境變量。3 shell變量
shell變量是由shell程序設置的特殊變量。shell變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了shell的正常運行
shell中一些比較特殊的變量:
特殊變量 含義$0 當前腳本的文件名傳遞給腳本或函數的參數。是一個數字,表示第幾個參數。例如,第一個參數是1,第二個參數是$2。$# 傳遞給腳本或函數的參數個數。$* 傳遞給腳本或函數的全部參數。傳遞給腳本或函數的全部參數。被雙引號包含時,與* 稍有不一樣,下面將會講到。$? 上個命令的退出狀態,或函數的返回值。$$ 當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。這些變量咱們留在這裏備份,有用到就能夠查。
算數運算
Bash 支持不少運算符,包括算數運算符、關係運算符、布爾運算符、字符串運算符和文件測試運算符。原生bash不支持簡單的數學運算,可是能夠經過其餘命令來實現,例如 awk 和 expr,expr 最經常使用。expr 是一款表達式計算工具,使用它能完成表達式的求值操做。
接着寫一小段shell,按照下圖:
/bin/bash
value=expr 2 + 2
echo "Total value :${value}"圖中有幾個點要注意,第一行是linux的註釋,以#號開頭。在第二行中注意賦值地方是沒有空格的,而在計算表達式的時候之間是有空格的。 expr 2 + 2表達式被 ` 號括起來。注意 · 號並非單引號,而是鍵盤上Esc下面的符號。(半角英文模式)
運行結果
Lee@Lee-PC /Desktop$ sh test.shTotal value :4
好了接着跟我一塊兒輸入以下內容:
/bin/bash
a=10 b=20 value=expr 2 + 2 echo "Total value :${value}" value=expr $a \* $b echo "a * b : ${value}" value=expr $b % $a echo "a % b : ${value}" if [ a == b ] then echo "a equals b" fi if [ a != b ] then echo "a not equals b" fi
一塊兒看看運行結果是否是相同。
$ sh test.sh Total value :4 a * b : 200 a % b : 0 a not equals b
對上面稍作說明:
在計算a * b的時候,咱們的表示有用到轉義字符 \ (反斜槓)
條件表達式要放在方括號之間,而且要有空格,例如 [b] 是錯誤的,必須寫成 [ b ]
if...then...fi 是條件語句,後面咱們會對其再進行了解
關係運算
接着上面的腳本,咱們繼續編輯輸入:
if [ a -eq b ] then echo "a -eq b" else echo "a not equals b " fi if [ a -gt b ] then echo "a gt b" else echo "a not greater than b" fi if [ a -le b ] then echo "a le b" else echo "a not less or equal to b" fi
運行結果:(有前面編輯輸入過的內容哈)
$ sh test.sh Total value :4 a * b : 200 a % b : 0 a not equals b a not equals b a not greater than b 10 le 20
好了,寫腳本的時候就能猜出來-gt 和-le的做用吧。咱們系統的來看看
關係運算符列表
運算符 | 說明 | 說明 |
---|---|---|
-eq | 檢測兩個數是否相等,相等返回 true。 | [ b ] 返回 true。 |
-ne | 檢測兩個數是否相等,不相等返回 true。 | [ b ] 返回 true。 |
-gt | 檢測左邊的數是否大於右邊的,若是是,則返回 true。 | [ b ] 返回 false。 |
-lt | 檢測左邊的數是否大於右邊的,若是是,則返回 true。 | [ b ] 返回 true。 |
-ge | 檢測左邊的數是否大等於右邊的,若是是,則返回 true。 | [ b ] 返回 false。 |
-le | 檢測左邊的數是否小於等於右邊的,若是是,則返回 true | [ b ] 返回 true。 |