一、 變量賦值
(1)
(2) 語句給變量賦值
(3) 只讀變量:使用 readonly 命令可以將變量定義為只讀變量,只讀變量的值不能被改變
(4) 刪除變量:使用 readonly 命令可以將變量定義為只讀變量,只讀變量的值不能被改變
二、 Shell字符串
(1) 單引號
單引號字符串的限制:
- 單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的;
- 單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符后也不行),但可成對出現,作為字符串拼接使用。
(2) 雙引號
雙引號的優點:
- 雙引號里可以有變量
- 雙引號里可以出現轉義字符
(3) 拼接字符串
雙引號
單引號
(4) 獲取字符串長度
(5) 提取子字符串
(6) 查找字符串
查找支付b或c的位置(哪個字母先出現就計算哪個)
string="abc123jbc"
echo `expr index "$string" bc`
(注意是反引號”`”)
三、 Shell數組
(1) 定義數組
在 Shell 中,用括號來表示數組,數組元素用"空格"符號分割開。
或者:
(2) 讀取數組
讀取數組元素值的一般格式是:${數組名[下標]}
使用“@”符號可以獲取數組中的所有元素:
(3) 獲取數組的長度
或者
四、 注釋
(1) 單行注釋
以 # 開頭的行就是注釋,會被解釋器忽略。
(2) 多行注釋
五、 傳遞參數
(1) 傳遞參數
以下實例我們向腳本傳遞三個參數,並分別輸出,其中 $0 為執行的文件名:
(2) 幾個特殊字符用來處理參數:
參數處理 |
說明 |
$# |
傳遞到腳本的參數個數 |
$* |
以一個單字符串顯示所有向腳本傳遞的參數。 |
$$ |
腳本運行的當前進程ID號 |
$! |
后台運行的最后一個進程的ID號 |
$@ |
與$*相同,但是使用時加引號,並在引號中返回每個參數。 |
$- |
顯示Shell使用的當前選項,與set命令功能相同。 |
$? |
顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。 |
$* 與 $@ 區別:
相同點:都是引用所有參數。
不同點:只有在雙引號中體現出來。假設在腳本運行時寫了三個參數 1、2、3,,則 " * " 等價於 "1 2 3"(傳遞了一個參數),而 "@" 等價於 "1" "2" "3"(傳遞了三個參數)。
六、 運算符
(1) 算數運算符
原生bash不支持簡單的數學運算,但是可以通過其他命令來實現,例如 awk 和 expr,expr 最常用。
expr 是一款表達式計算工具,使用它能完成表達式的求值操作。
例如,兩個數相加(注意使用的是反引號 ` 而不是單引號 '):
或者
或者
(2) 關系運算符
關系運算符只支持數字,不支持字符串,除非字符串的值是數字。
下表列出了常用的關系運算符,假定變量 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。 |
(3) 布爾運算符
下表列出了常用的布爾運算符,假定變量 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。 |
(4) 邏輯運算符
假定變量 a 為 10,變量 b 為 20:
運算符 |
說明 |
舉例 |
&& |
邏輯的 AND |
[[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| |
邏輯的 OR |
[[ $a -lt 100 || $b -gt 100 ]] 返回 true |
(5) 字符串運算符
下表列出了常用的字符串運算符,假定變量 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。 |
$ |
檢測字符串是否為空,不為空返回 true。 |
[ $a ] 返回 true。 |
(6) 文件測試運算符
文件測試運算符用於檢測 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。 |
[ -r $file ] 返回 true。 |
-w file |
檢測文件是否可寫,如果是,則返回 true。 |
[ -w $file ] 返回 true。 |
-x file |
檢測文件是否可執行,如果是,則返回 true。 |
[ -x $file ] 返回 true。 |
-s file |
檢測文件是否為空(文件大小是否大於0),不為空返回 true。 |
[ -s $file ] 返回 true。 |
-e file |
檢測文件(包括目錄)是否存在,如果是,則返回 true。 |
[ -e $file ] 返回 true。 |
七、 echo
參數說明:
- -p 輸入提示文字
- -n 輸入字符長度限制(達到6位,自動結束)
- -t 輸入限時
- -s 隱藏輸入內容
八、 test 命令
Shell中的 test 命令用於檢查某個條件是否成立,它可以進行數值、字符和文件三個方面的測試。
九、 流程控制
(1) if else
if else 語法格式:
if condition
then
command1
command2
...
commandN
else
command
fi
寫成一行(適用於終端命令提示符):
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
(2) if else-if else
if else-if else 語法格式:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
末尾的fi就是if倒過來拼寫,后面還會遇到類似的。
以下判斷兩個變量是否相等:
(3) for循環
for循環一般格式為:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
寫成一行:
for var in item1 item2 ... itemN; do command1; command2… done;
當變量值在列表里,for循環即執行一次所有命令,使用變量名獲取列表中的當前取值。命令可為任何有效的shell命令和語句。in列表可以包含替換、字符串和文件名。
in列表是可選的,如果不用它,for循環使用命令行的位置參數。
順序輸出當前列表中的數字:
順序輸出字符串中的字符:
(4) while循環
while循環用於不斷執行一系列命令,也用於從輸入文件中讀取數據;命令通常為測試條件。其格式為:
while condition
do
command
done
使用中使用了 Bash let 命令,它用於執行一個或多個表達式,變量計算中不需要加上 $ 來表示變量,
while循環可用於讀取鍵盤信息。下面的例子中,輸入信息被設置為變量FILM,按<Ctrl-D>結束循環。
echo '按下 <CTRL-D> 退出'
echo -n '輸入你最喜歡的網站名: '
while read FILM
do
echo "是的!$FILM 是一個好網站"
done
(5) 無限循環
無限循環語法格式:
while :
do
command
done
或者
while true
do
command
done
或者
for (( ; ; ))
(6) until 循環
until 循環執行一系列命令直至條件為 true 時停止。
until 循環與 while 循環在處理方式上剛好相反。
一般 while 循環優於 until 循環,但在某些時候—也只是極少數情況下,until 循環更加有用。
until 語法格式:
until condition
do
command
done
(7) case
case語句為多選擇語句。可以用case語句匹配一個值與一個模式,如果匹配成功,執行相匹配的命令。case語句格式如下:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
case工作方式如上所示。取值后面必須為單詞in,每一模式必須以右括號結束。取值可以為變量或常數。匹配發現取值符合某一模式后,其間所有命令開始執行直至 ;;。
取值將檢測匹配的每一個模式。一旦模式匹配,則執行完匹配模式相應命令后不再繼續其他模式。如果無一匹配模式,使用星號 * 捕獲該值,再執行后面的命令。
(8) break命令
break命令允許跳出所有循環(終止執行后面的所有循環)。
(9) continue命令
continue命令與break命令類似,只有一點差別,它不會跳出所有循環,僅僅跳出當前循環。
運行代碼發現,當輸入大於5的數字時,該例中的循環不會結束,語句 echo "游戲結束" 永遠不會被執行。
(10) esac
case的語法和C family語言差別很大,它需要一個esac(就是case反過來)作為結束標記,每個case分支用右圓括號,用兩個分號表示break。
十、 函數
linux shell 可以用戶定義函數,然后在shell腳本中可以隨便調用。
shell中函數的定義格式如下:
[ function ] funname [()]
{
action;
[return int;]
}
(1) 帶return函數
(2) 函數參數
在Shell中,調用函數時可以向其傳遞參數。在函數體內部,通過 $n 的形式來獲取參數的值,例如,$1表示第一個參數,$2表示第二個參數...
注意,$10 不能獲取第十個參數,獲取第十個參數需要${10}。當n>=10時,需要使用${n}來獲取參數。
另外,還有幾個特殊字符用來處理參數:
參數處理 |
說明 |
$# |
傳遞到腳本的參數個數 |
$* |
以一個單字符串顯示所有向腳本傳遞的參數 |
$$ |
腳本運行的當前進程ID號 |
$! |
后台運行的最后一個進程的ID號 |
$@ |
與$*相同,但是使用時加引號,並在引號中返回每個參數。 |
$- |
顯示Shell使用的當前選項,與set命令功能相同。 |
$? |
顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。 |
十一、 輸入/輸出重定向
大多數 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)。
(1) 輸出重定向
重定向一般通過在命令間插入特定的符號來實現。特別的,這些符號的語法如下所示:
command1 > file1
上面這個命令執行command1然后將輸出的內容存入file1。
注意任何file1內的已經存在的內容將被新內容替代。如果要將新內容添加在文件末尾,請使用>>操作符。
(2) 輸入重定向
和輸出重定向一樣,Unix 命令也可以從文件獲取輸入,語法為:
command1 < file1
這樣,本來需要從鍵盤獲取輸入的命令會轉移到文件讀取內容。
注意:輸出重定向是大於號(>),輸入重定向是小於號(<)。
注意:上面兩個例子的結果不同:第一個例子,會輸出文件名;第二個不會,因為它僅僅知道從標准輸入讀取內容。
同時替換輸入和輸出,執行wc,從文件infile讀取內容,然后將輸出寫入到outfile中。
十二、 文件包含
和其他語言一樣,Shell 也可以包含外部腳本。這樣可以很方便的封裝一些公用的代碼作為一個獨立的文件。
Shell 文件包含的語法格式如下:
. filename # 注意點號(.)和文件名中間有一空格
或
source filename
為 test2.sh 添加可執行權限並執行
注:被包含的文件 test1.sh 不需要可執行權限。
參考資料:
https://www.runoob.com/linux/linux-shell.html