1. 程式人生 > >linux中shell教程

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