linux中shell教程
shell介紹
Shell 是一個用 C 語言編寫的程式,它是使用者使用 Linux 的橋樑。Shell 既是一種命令語言,又是一種程式設計語言。Shell 是指一種應用程式,這個應用程式提供了一個介面,使用者通過這個介面訪問作業系統核心的服務。
Shell 指令碼(shell script),是一種為 shell 編寫的指令碼程式。業界所說的 shell 通常都是指 shell 指令碼,但讀者朋友要知道,shell 和 shell script 是兩個不同的概念。由於習慣的原因,簡潔起見,本文出現的 "shell程式設計" 都是指 shell 指令碼程式設計,不是指開發 shell 自身。
基本操作
Linux 的 Shell 種類眾多,本文講的是 Bash,Bash 也是大多數Linux 系統預設的 Shell。
在一般情況下,人們並不區分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同樣也可以改為 #!/bin/bash。#! 告訴系統其後路徑所指定的程式即是解釋此指令碼檔案的 Shell 程式。
建立一個shell指令碼
開啟文字編輯器(可以使用 vi/vim 命令來建立檔案),新建一個檔案 test.sh,副檔名為 sh(sh代表shell),副檔名並不影響指令碼執行。
#!/bin/bash echo "Hello World !"
#! 是一個約定的標記,它告訴系統這個指令碼需要什麼直譯器來執行,即使用哪一種 Shell。
執行
在我們假設你寫的這個程式檔名是 /home/dmtsai/shell.sh 好了,那如何執行這個檔案?很簡單,可以有底下幾個方法:
- 直接命令下達: shell.sh 檔案必須要具備可讀與可執行 (rx) 的許可權,然後:
- 絕對路徑:使用 /home/dmtsai/shell.sh 來下達命令;
- 相對路徑:假設工作目錄在 /home/dmtsai/ ,則使用 ./shell.sh 來執行
- 變數『PATH』功能:將 shell.sh 放在 PATH 指定的目錄內,例如: ~/bin/
- 以 bash 程式來執行:透過『 bash shell.sh 』或『 sh shell.sh 』來執行
變數
定義變數時,變數名不加美元符號($,PHP語言中變數需要),如:
your_name="runoob.com"
注意,變數名和等號之間不能有空格,這可能和你熟悉的所有程式語言都不一樣。
同時,變數名的命名須遵循如下規則:
- 命名只能使用英文字母,數字和下劃線,首個字元不能以數字開頭。
- 中間不能有空格,可以使用下劃線(_)。
- 不能使用標點符號。
- 不能使用bash裡的關鍵字(可用help命令檢視保留關鍵字)。
使用變數
使用一個定義過的變數,只要在變數名前面加美元符號即可,如:
your_name="qinjx"
echo $your_name
echo ${your_name}
變數名外面的花括號是可加可不加,加花括號是為了幫助直譯器識別變數的邊界。推薦給所有變數加上花括號,這是個好的程式設計習慣。
其他
- 使用 readonly 命令可以將變數定義為只讀變數,只讀變數的值不能被改變。
-
#!/bin/bash myUrl="http://www.google.com" readonly myUrl
- 使用 unset 命令可以刪除變數。unset 命令不能刪除只讀變數。
unset variable_name
Shell 字串
字串是shell程式設計中最常用最有用的資料型別(除了數字和字串,也沒啥其它型別好用了),字串可以用單引號,也可以用雙引號,也可以不用引號。單雙引號的區別跟PHP類似。
單引號字串的限制:
- 單引號裡的任何字元都會原樣輸出,單引號字串中的變數是無效的;
- 單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符後也不行),但可成對出現,作為字串拼接使用。
雙引號的優點:
- 雙引號裡可以有變數
- 雙引號裡可以出現轉義字元
字串操作
- 獲取字串長度
string="abcd"
echo ${#string} #輸出 4
- 提取子字串。 以下例項從字串第 2 個字元開始擷取 4 個字元:
string="runoob is a great site"
echo ${string:1:4} # 輸出 unoo
- 查詢子字串。 查詢字元 i 或 o 的位置(哪個字母先出現就計算哪個):
string="runoob is a great site"
echo `expr index "$string" io` # 輸出 4
注意: 以上指令碼中 ` 是反引號,而不是單引號 ',不要看錯了哦。
運算子
算術運算子
同其他語言
關係運算符
關係運算符只支援數字,不支援字串,除非字串的值是數字。
下表列出了常用的關係運算符,假定變數 a 為 10,變數 b 為 20:
運算子 | 說明 | 舉例 |
---|---|---|
-eq | 檢測兩個數是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 檢測兩個數是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 檢測左邊的數是否大於右邊的,如果是,則返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 檢測左邊的數是否小於右邊的,如果是,則返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 檢測左邊的數是否大於等於右邊的,如果是,則返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 檢測左邊的數是否小於等於右邊的,如果是,則返回 true。 | [ $a -le $b ] 返回 true。 |
布林運算子
下表列出了常用的布林運算子,假定變數 a 為 10,變數 b 為 20:
運算子 | 說明 | 舉例 |
---|---|---|
! | 非運算,表示式為 true 則返回 false,否則返回 true。 | [ ! false ] 返回 true。 |
-o | 或運算,有一個表示式為 true 則返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 與運算,兩個表示式都為 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
字串運算子
下表列出了常用的字串運算子,假定變數 a 為 "abc",變數 b 為 "efg":
運算子 | 說明 | 舉例 |
---|---|---|
= | 檢測兩個字串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 檢測兩個字串是否相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 檢測字串長度是否為0,為0返回 true。 | [ -z $a ] 返回 false。 |
-n | 檢測字串長度是否為0,不為0返回 true。 | [ -n "$a" ] 返回 true。 |
str | 檢測字串是否為空,不為空返回 true。 | [ $a ] 返回 true。 |
檔案測試運算子
檔案測試運算子用於檢測 Unix 檔案的各種屬性。屬性檢測描述如下:
引數 | 說明 | |
---|---|---|
-e 檔名 | 如果檔案存在則為真 | |
-r 檔名 | 如果檔案存在且可讀則為真 | |
-w 檔名 | 如果檔案存在且可寫則為真 | |
-x 檔名 | 如果檔案存在且可執行則為真 | |
-s 檔名 | 如果檔案存在且至少有一個字元則為真 | |
-d 檔名 | 如果檔案存在且為目錄則為真 | |
-f 檔名 | 如果檔案存在且為普通檔案則為真 | |
-c 檔名 | 如果檔案存在且為字元型特殊檔案則為真 | |
-b 檔名 | 如果檔案存在且為塊特殊檔案則為真 |
echo命令
Shell 的 echo 指令與 PHP 的 echo 指令類似,都是用於字串的輸出。命令格式:
echo string
- 顯示換行
echo -e "OK! \n" # -e 開啟轉義 echo "It is a test"
- 顯示結果定向至檔案
echo "It is a test" > myfile
if else
if 語句語法格式:
if condition then command1 command2 ... commandN fi
for 迴圈
for迴圈一般格式為:
for var in item1 item2 ... itemN do command1 command2 ... commandN done
函式
shell中函式的定義格式如下:
[ function ] funname [()] { action; [return int;] }
輸入/輸出重定向
大多數 UNIX 系統命令從你的終端接受輸入並將所產生的輸出傳送回到您的終端。一個命令通常從一個叫標準輸入的地方讀取輸入,預設情況下,這恰好是你的終端。同樣,一個命令通常將其輸出寫入到標準輸出,預設情況下,這也是你的終端。
重定向命令列表如下:
命令 | 說明 |
---|---|
command > file | 將輸出重定向到 file。 |
command < file | 將輸入重定向到 file。 |
command >> file | 將輸出以追加的方式重定向到 file。 |
n > file | 將檔案描述符為 n 的檔案重定向到 file。 |
n >> file | 將檔案描述符為 n 的檔案以追加的方式重定向到 file。 |
n >& m | 將輸出檔案 m 和 n 合併。 |
n <& m | 將輸入檔案 m 和 n 合併。 |
<< tag | 將開始標記 tag 和結束標記 tag 之間的內容作為輸入。 |
需要注意的是檔案描述符 0 通常是標準輸入(STDIN),1 是標準輸出(STDOUT),2 是標準錯誤輸出(STDERR)。
轉載來源:http://www.runoob.com/linux/linux-shell.html