指定指令碼解譯器
#!/bin/bash
注意: 1、該聲明只能放在指令碼的首行,說明該指令碼使用bash解譯器來解釋執行,否則會被當成注釋 2、bash必須使用絕對路徑
3、該聲明只在指令碼作為可執行程式,通過./test.sh調用是才有效,如果通過sh test.sh 則會直接運行sh解譯器 test.sh只是作為參數傳遞而已
調試指令碼 通過參數-x來調試指令碼
sh -x test.sh
這將執行該指令碼並顯示所有變數的值。
shell還有一個不需要執行指令碼只是檢查文法的模式。可以這樣使用:
sh -n test,sh
這將返回所有語法錯誤
shell變數
1、readonly設定唯讀變數
#!/bin/bashname="Jack"readonly namename="Jams"
readonly修飾後,name的值不能再改變,否則執行會報錯: name: readonly variable
2、 unset 刪除變數 相當於將變數置為空白,unset不可以刪除唯讀變數
3、變數類型 運行shell時,會同時存在三種變數:
1) 局部變數 局部變數在指令碼或命令中定義,僅在當前shell執行個體中有效,其他shell啟動的程式不能訪問局部變數。
2) 環境變數 所有的程式,包括shell啟動的程式,都能訪問環境變數,有些程式需要環境變數來保證其正常運行。必要的時候shell指令碼也可以定義環境變數。
3) shell變數 shell變數是由shell程式設定的特殊變數。shell變數中有一部分是環境變數,有一部分是局部變數,這些變數保證了shell的正常運行
4、特殊變數 $0 當前指令碼的檔案名稱
$n 傳遞給指令碼或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
$# 傳遞給指令碼或函數的參數個數。
$* 傳遞給指令碼或函數的所有參數。
$@ 傳遞給指令碼或函數的所有參數。
$? 上個命令的退出狀態,或函數的傳回值。
$$ 當前Shell進程ID。對於 Shell 指令碼,就是這些指令碼所在的進程ID。
$* 和 $@ 都表示傳遞給函數或指令碼的所有參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出所有參數。
但是當它們被雙引號(" ")包含時,
"$*" 會將所有的參數作為一個整體,以"$1 $2 … $n"的形式輸出所有參數;
"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出所有參數。
單引號與雙引號 單引號用於保持引號內 所有字元的字面值,即使引號內的\和斷行符號也不例外,但是字串中 不能再出現單引號。
雙引號用於保持引號內所有字元的字面值(斷行符號也不例外), 但以下情況除外:
$加變數名可以取變數的值
反引號仍表示命令替換
\$表示$的字面值
\`表示`的字面值
\"表示"的字面值
\\表示\的字面值
除以上情況之外,在其它字元前面的\無特殊含義,只表示字面值。
算數運算
下表列出了常用的算術運算子,假定變數 a 為 10,變數 b 為 20:
運算子 |
說明 |
舉例 |
+ |
加法 |
`expr $a + $b` 結果為 30。 |
- |
減法 |
`expr $a - $b` 結果為 -10。 |
* |
乘法 |
`expr $a \* $b` 結果為 200。 |
/ |
除法 |
`expr $b / $a` 結果為 2。 |
% |
取餘 |
`expr $b % $a` 結果為 0。 |
= |
賦值 |
a=$b 將把變數 b 的值賦給 a。 |
運算式和運算子之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數程式設計語言不一樣。
完整的運算式要被 ` ` 包含,注意這個字元不是常用的單引號,在 Esc 鍵下邊。
乘法符號需要轉義
除了expr,還可以用(())來表示,例如:var=$(( 20 + 5 ))
數位關係運算子
關係運算子只支援數字,不支援字串,除非字串的值是數字。
下表列出了常用的關係運算子,假定變數 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。 |
以下介紹 Shell 的邏輯運算子(注意用了雙中括弧),假定變數 a 為 10,變數 b 為 20:
運算子 |
說明 |
舉例 |
&& |
邏輯的 AND |
[[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| |
邏輯的 OR |
[[ $a -lt 100 || $b -gt 100 ]] 返回 true |
字串運算子
下表列出了常用的字串運算子,假定變數 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。 |
字串比較的> < 要轉義,否則會被當作重新導向符號
字串處理
取長度
str="abcd"expr length $str # 4echo ${#str} # 4
尋找子串的位置
str="abc"expr index $str "a" # 1expr index $str "b" # 2expr index $str "x" # 0expr index $str "" # 0
截取子串
str="abcdef"expr substr "$str" 1 3 # 從第一個位置開始取3個字元, abcexpr substr "$str" 2 5 # 從第二個位置開始取5個字元, bcdef expr substr "$str" 4 5 # 從第四個位置開始取5個字元, defecho ${str:2} # 從第二個位置開始提取字串, bcdefecho ${str:2:3} # 從第二個位置開始提取3個字元, bcdecho ${str:(-6):5} # 從倒數第二個位置向左提取字串, abcdeecho ${str:(-4):3} # 從倒數第二個位置向左提取6個字元, cdestr="abbc,def,ghi,abcjkl"echo ${str#a*c} # 輸出,def,ghi,abcjkl 一個井號(#) 表示從左邊截取掉最短的匹配 (這裡把abbc字串去掉)echo ${str##a*c} # 輸出jkl, 兩個井號(##) 表示從左邊截取掉最長的匹配 (這裡把abbc,def,ghi,abc字串去掉)echo ${str#"a*c"} # 輸出abbc,def,ghi,abcjkl 因為str中沒有"a*c"子串echo ${str##"a*c"} # 輸出abbc,def,ghi,abcjkl 同理echo ${str#*a*c*} # 空echo ${str##*a*c*} # 空echo ${str#d*f) # 輸出abbc,def,ghi,abcjkl, echo ${str#*d*f} # 輸出,ghi,abcjkl echo ${str%a*l} # abbc,def,ghi 一個百分比符號(%)表示從右邊截取最短的匹配 echo ${str%%b*l} # a 兩個百分比符號表示(%%)表示從右邊截取最長的匹配echo ${str%a*c} # abbc,def,ghi,abcjkl
字串替換
str="apple, tree, apple tree"echo ${str/apple/APPLE} # 替換第一次出現的appleecho ${str//apple/APPLE} # 替換所有apple echo ${str/#apple/APPLE} # 如果字串str以apple開頭,則用APPLE替換它echo ${str/%apple/APPLE} # 如果字串str以apple結尾,則用APPLE替換它
大小寫轉換
##轉為大寫echo $PATH | tr '[a-z]' '[A-Z]'##轉為小寫echo $PATH | tr '[A-Z]' '[a-z]'
檔案測試運算子
檔案測試運算子用於檢測 Unix 檔案的各種屬性。
屬性檢測描述如下:
操作符 |
說明 |
舉例 |
-b file |
檢測檔案是否是塊裝置檔案,如果是,則返回 true。 |
[ -b $file ] 返回 false。 |
-c file |
檢測檔案是否是字元裝置檔案,如果是,則返回 true。 |
[ -c $file ] 返回 false。 |
-d file |
檢測檔案是否是目錄,如果是,則返回 true。 |
[ -d $file ] 返回 false。 |
-f file |
檢測檔案是否是普通檔案(既不是目錄,也不是裝置檔案),如果是,則返回 true。 |
[ -f $file ] 返回 true。 |
-g file |
檢測檔案是否設定了 SGID 位,如果是,則返回 true。 |
[ -g $file ] 返回 false。 |
-k file |
檢測檔案是否設定了粘著位(Sticky Bit),如果是,則返回 true。 |
[ -k $file ] 返回 false。 |
-p file |
檢測檔案是否是有名管道,如果是,則返回 true。 |
[ -p $file ] 返回 false。 |
-u file |
檢測檔案是否設定了 SUID 位,如果是,則返回 true。 |
[ -u $file ] 返回 false。 |
-r file |
檢測檔案是否可讀,如果是,則返回 true。</ |