概述
Shell 是一種腳本語言,那么,就必須有解釋器來執(zhí)行這些腳本,常見的腳本解釋器有:
bash:是 Linux 標準默認的 shell。bash 由 Brian Fox 和 Chet Ramey 共同完成,是 BourneAgain Shell 的縮寫,內(nèi)部命令一共有 40 個。
sh :由 Steve Bourne 開發(fā),是 Bourne Shell 的縮寫,sh 是 Unix 標準默認的 shell。
另外還有:ash、 csh、 ksh 等。我們可以在終端通過以下命令來查看當前系統(tǒng)支持哪些 shell 類型:
cat /etc/shells
比如我的系統(tǒng)是 Mac OS,那么結(jié)果顯示如下:
MoosdeMacBook-Pro:Desktop moos$ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.
/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
Shell 經(jīng)過了 POSIX 的標準化,使其可以在不同的 Linux 系統(tǒng)上進行移植,它屬于解釋性語言。本文關(guān)注的是 bash,也就是 Bourne Again Shell,由于易用和免費,Bash 在日常工作中被廣泛使用。同時,Bash 也是大多數(shù)Linux 系統(tǒng)默認的 Shell。Shell 的運行模式大概分為兩種:
交互式:在終端直接輸入命令進行執(zhí)行,并等待執(zhí)行完畢后再去執(zhí)行下一條命令。
非交互式:以非交互式方式執(zhí)行的shell就是運行過程中不需要與用戶輸入輸出打交道的shell。其實就是命令的集合,將命令集合直接放在一個腳本文件中,然后由 Bash Shell 讀取并執(zhí)行。一般情況下運維人員會把需要處理的命令邏輯寫入腳本文件中,一次執(zhí)行即可。也就是實現(xiàn)了 Linux 的自動化運維,效率也更高。
本文中講解的 Shell 腳本都是基于非交互式,這樣更容易對某一具體腳本功能做集中化管理。
第一個 Shell 腳本
按照舊例,我們先從一個 Hello world 開始,首先創(chuàng)建一個 sh
格式的文件 hello_world.sh
:
touch hello_world.sh
接著打開該文件,并加入如下 code:
#!/bin/bash
# first shell
echo "Hello, world!"
程序很簡單,一共就三行,第二行是注釋。#!
是一種約定的標記,表示該腳本應該通過什么類型的解釋器來執(zhí)行,可以看到,我們這里使用的是 bash 類型解釋器。那么我們的第一個腳本編寫好了,應該如何執(zhí)行呢?其實很簡單,只需要在終端執(zhí)行下面命令:
MoosdeMacBook-Pro:Desktop moos$ chmod +x hello_world.sh
MoosdeMacBook-Pro:Desktop moos$ ./hello_world.sh
Hello, world!
MoosdeMacBook-Pro:Desktop moos$
chmod +x
命令是為了讓 hello_world.sh
擁有可執(zhí)行權(quán)限,接著通過 ./hello_world.sh
就可以成功執(zhí)行我們的第一個腳本啦,可以看到終端的確打印出了預期的提示。echo 命令是 Shell 的一個內(nèi)部指令,用于在屏幕上打印出指定的字符串。除此以外還有 printf
命令,可以實現(xiàn)更加強大的格式化輸出操作,它們的用法將在后面介紹。
和大多數(shù)語言一樣,Shell 也擁有完整的語法結(jié)構(gòu),例如變量、函數(shù)、表達式、運算符、語句塊等等,其中很多規(guī)則和主流語言類似,但作為腳本語言,它也擁有一些特殊的技能,我們下面一起來了解一下。
Shell 中的變量
為了方便,我們通過下面這個例子來看一下如何定義變量:
#!/bin/bash
player_name='Moosphon'
player_country="China"
player_score=96
echo $player_name
echo ${player_country}
player_name=Jack
echo "${player_name}'s score is ${player_score}"
在終端執(zhí)行上述腳本的結(jié)果如下所示:
MoosdeMacBook-Pro:Desktop moos$ ./hello_world.sh
Moosphon
China
Jack's score is 96
我們在定義變量的時候不需要為其指定具體的數(shù)據(jù)類型,常見的數(shù)據(jù)類型有整型、字符串和數(shù)組。關(guān)于變量的定義,需要注意的是,變量名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時,變量的命名須遵循如下規(guī)則:
- 命名只能使用英文字母,數(shù)字和下劃線,首個字符不能以數(shù)字開頭
- 變量名中間不能有空格,可以使用下劃線
- 不能使用標點符號
- 不能使用bash里的關(guān)鍵字(可用 help 命令查看保留關(guān)鍵字)
當然,除了這些基本操作以外,Shell 還支持通過 Linux 語句來給變量賦值:
for file in `ls /Users/xx/Desktop`
或
for file in $(ls /Users/xx/Desktop)
顧名思義,以上是遍歷桌面目錄下的所有文件。另外,我們可以在 shell 中定義只讀變量,即有點類似于 Java 中的 final
類型變量,一旦賦值以后就不能被修改其值:
#!/bin/bash
myName="Jack"
readonly myName
myName="Tom"
#會報錯:/bin/sh: NAME: This variable is read only.
字符串
字符串類型應該是最常用到的數(shù)據(jù)類型了,它可以通過單引號,雙引號,甚至不用引號來定義,上方的例子中已經(jīng)給出示例。單引號只能原樣輸出字符串,比較局限,而雙引號支持格式化操作,例如添加轉(zhuǎn)義符。也支持占位操作,即上面例子中在字符串中穿插具體變量,雖然是可以直接通過 $paramName
的方式來使用,但會引起歧義,推薦使用 ${paramName}
的方式。這里再來針對字符串幾個常見的功能需求來看一下 Shell 中該如何實:
-
獲取字符串長度
我們可以通過以下語句來獲取字符串的長度:
word="friend" echo ${#friend} #輸出結(jié)果為:6
-
字符串提取
字符串的提取也很簡單:
welcome_words="Hello everyone, welcome to my kingdom!" echo ${welcome_words:6:8} #輸出結(jié)果為:everyone
其中,第一個冒號后面的數(shù)字是初始位置,而第二個冒號后的數(shù)字則是要截取的長度。
-
獲取子字符串位置
獲取字符串中某個字符的位置需要借助于
expr
命令來求表達式的值:welcome_words="Hello everyone, welcome to my kingdom!" echo ${welcome_words:6:8} echo `expr index "$welcome_words" e` #輸出結(jié)果為:1
數(shù)組
Shell 中同樣擁有數(shù)組類型,bash 支持一維數(shù)組(不支持多維數(shù)組),并且沒有限定數(shù)組的大小。與其他主流語言類似,數(shù)組元素的下標由 0 開始編號,獲取數(shù)組中的元素要利用下標,下標可以是整數(shù)或算術(shù)表達式,其值應大于或等于 0。我們可以通過如下方式來定義和使用數(shù)組:
#!/bin/bash
player_array=(Jack Tom Bob Lucy)
#or
player_array[0]=Jack
player_array[1]=Tom
player_array[2]=Bob
player_array[3]=Lucy
echo "the first player is ${player_array[0]}"
#結(jié)果:the first player is Jack
echo "All players: ${player_array[@]}"
#結(jié)果:All players:Jack Tom Bob Lucy
echo "We have ${#player_array[@]} players"
#or
echo "We have ${#player_array[*]} players"
#結(jié)果:We have 4 players
定義數(shù)組和其他語言類似,可以通過括號聲明一個元素集合,并在內(nèi)部定義元素,也可以通過指定數(shù)組下標值的形式來定義數(shù)組。值得注意的是,我們可以直接通過 array[@]
來獲取所有元素,并可以通過 ${#array[]@}
或者 ${#array[*]}
來獲取數(shù)組大小。
變量類型
運行 shell 時,會同時存在如下三種變量:
-
局部變量
局部變量在腳本或命令中定義,僅在當前 shell 實例中有效,其他 shell 啟動的程序不能訪問局部變量。
-
環(huán)境變量
所有的程序,包括 shell 啟動的程序,都能訪問環(huán)境變量,有些程序需要環(huán)境變量來保證其正常運行。必要的時候 shell 腳本也可以定義環(huán)境變量。
-
shell 變量
shell 變量是由 shell 程序設置的特殊變量。shell 變量中有一部分是環(huán)境變量,有一部分是局部變量,這些變量保證了 shell 的正常運行
本文之前的示例中一直都在使用局部變量,環(huán)境變量部分涉及到內(nèi)容還比較多,本文篇幅有限,后續(xù)會專門針對環(huán)境變量來發(fā)文一篇,詳細介紹環(huán)境變量的分類以及如何查看和配置。
Shell 的參數(shù)傳遞
如果參數(shù)只能控制在腳本代碼內(nèi)部,那么它就失去了靈活性,因此,Shell 提供了參數(shù)傳遞功能,可以讓我們在執(zhí)行腳本時傳入?yún)?shù),就像給一個函數(shù)傳參一樣。我們先來看下面這個簡單示例:
#!/bin/bash
echo "輸入的玩家昵稱: $1"
echo "輸入的玩家分數(shù): $2"
echo "玩家信息的種類: $#"
echo "玩家信息: $*"
通過以下命令格式來執(zhí)行:
? Desktop ./hello_world.sh Jack 100
輸入的玩家昵稱: Jack
輸入的玩家分數(shù): 100
玩家信息的種類: 2
玩家信息: Jack 100
我們通過 $1...$n
來表示用戶輸入的第幾個參數(shù)變量,可以看到我們在終端輸入了兩個參數(shù),$1
代表我們輸入的第一個參數(shù) Jack
,而 $2
則代表輸入的第二個參數(shù)值 100
。除此以外,Shell 還提供了其他特殊字符來處理參數(shù):
參數(shù)格式 | 說明 |
---|---|
$# | 傳遞到腳本的參數(shù)個數(shù) |
$* | 以一個單字符串顯示所有向腳本傳遞的參數(shù)。 如 $* 用引號括起來的情況、以" |
$$ | 腳本運行的當前進程ID號 |
$! | 后臺運行的最后一個進程的ID號 |
$@ | 與 $* 相同,但是使用時加引號,并在引號中返回每個參數(shù)。 如 $@ 用 " 括起來的情況、以" |
$- | 顯示 Shell 當前使用的選項,與 set 命令功能相同。 |
$? | 顯示最后命令的退出狀態(tài)。0 表示沒有錯誤,其他任何值表明有錯誤。 |
Shell 中的運算符
與其他編程語言類似,Shell 中也提供了很多豐富的運算符,下面我們來一起認識一下。
算數(shù)運算符
原生 bash 雖然沒有提供算數(shù)運算功能,但可以通過其他命令來實現(xiàn),常見的有 awk
和 expr
,一般我們都使用 expr
就可以。舉個例子,我們可以通過下面語句實現(xiàn)加法運算:
#!/bin/bash
math_score=94
english_score=90
sum_score=`expr $math_score + $english_score`
echo "學生數(shù)學成績: ${math_score}"
echo "學生英語成績: ${english_score}"
echo "學生總分為: ${sum_score}"
我們需要注意兩點:
- 運算符和表達式之間要留有空格,否則會出錯
- 運算表達式需要被反引號 ``` `` 包裹
下面列舉一下常見的算數(shù)運算符,并給出用法示例:
運算符 | 說明 | 舉例(a=5, b=4) |
---|---|---|
+ | 加法 |
expr $a + $b 結(jié)果為 9。 |
- | 減法 |
expr $a - $b 結(jié)果為 1。 |
* | 乘法 |
expr $a \* $b 結(jié)果為 20。 |
/ | 除法 |
expr $b / $a 結(jié)果為 1。 |
% | 取余 |
expr $b % $a 結(jié)果為 4。 |
= | 賦值 |
a=$b 將把變量 b 的值賦給 a。 |
== | 相等。用于比較兩個數(shù)字,相同則返回 true。 |
[ $a == $b ] 返回 false。 |
!= | 不相等。用于比較兩個數(shù)字,不相同則返回 true。 |
[ $a != $b ] 返回 true。 |
關(guān)系運算符
關(guān)系運算符只支持數(shù)字,不支持字符串,除非字符串的值是數(shù)字。下表列出了常用的關(guān)系運算符,假設變量 a
為 6,變量 b
為 8:
運算符 | 說明 | 舉例 |
---|---|---|
-eq | 檢測兩個數(shù)是否相等,相等返回 true。 |
[ $a -eq $b ] 返回 false。 |
-ne | 檢測兩個數(shù)是否不相等,不相等返回 true。 |
[ $a -ne $b ] 返回 true。 |
-gt | 檢測左邊的數(shù)是否大于右邊的,如果是,則返回 true。 |
[ $a -gt $b ] 返回 false。 |
-lt | 檢測左邊的數(shù)是否小于右邊的,如果是,則返回 true。 |
[ $a -lt $b ] 返回 true。 |
-ge | 檢測左邊的數(shù)是否大于等于右邊的,如果是,則返回 true。 |
[ $a -ge $b ] 返回 false。 |
-le | 檢測左邊的數(shù)是否小于等于右邊的,如果是,則返回 true。 |
[ $a -le $b ] 返回 true。 |
布爾運算符
下表列出了常用的布爾運算符,假定變量 a
為 1,變量 b
為 2:
運算符 | 說明 | 舉例 |
---|---|---|
! | 非運算,表達式為 true 則返回 false,否則返回 true。 |
[ ! false ] 返回 true。 |
-o | 或運算,有一個表達式為 true 則返回 true。 |
[ $a -lt 2 -o $b -gt 10 ] 返回 true。 |
-a | 與運算,兩個表達式都為 true 才返回 true。 |
[ $a -lt 2 -a $b -gt 10 ] 返回 false。 |
邏輯運算符
下面看一下 Shell 的邏輯運算符,我們假設變量 a 為 1,變量 b 為 2:
運算符 | 說明 | 舉例 |
---|---|---|
&& | 邏輯的 AND |
[[ $a -lt 6 && $b -gt 6 ]] 返回 false |
|| | 邏輯的 OR |
[[ $a -lt 6 || $b -gt 6 ]] 返回 true |
字符串運算符
下表列出了常用的字符串運算符,我們假設變量 a
為 "Jack",變量 b
為 "Tom":
運算符 | 說明 | 舉例 |
---|---|---|
= | 檢測兩個字符串是否相等,相等返回 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。 |
文件測試運算符
文件測試運算符用于檢測 Unix 文件的各種屬性。常見的屬性檢測能力如下:
操作符 | 說明 |
---|---|
-b file | 檢測文件是否是塊設備文件,如果是,則返回 true。 |
-c file | 檢測文件是否是字符設備文件,如果是,則返回 true。 |
-d file | 檢測文件是否是目錄,如果是,則返回 true。 |
-f file | 檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。 |
-g file | 檢測文件是否設置了 SGID 位,如果是,則返回 true。 |
-k file | 檢測文件是否設置了粘著位(Sticky Bit),如果是,則返回 true。 |
-p file | 檢測文件是否是有名管道,如果是,則返回 true。 |
-u file | 檢測文件是否設置了 SUID 位,如果是,則返回 true。 |
-r file | 檢測文件是否可讀,如果是,則返回 true。 |
值得一提的是,Shell 里面的中括號 ( 即 []
) 可用于一些條件的測試,上述的運算符一節(jié)已經(jīng)看到它出現(xiàn)了很多次,可以用來做算術(shù)比較、字符串比較、文件屬性的邏輯判斷等等,后續(xù)我們編寫腳本過程中會經(jīng)常和它打交道。判斷條件如果太多可能容易出錯,這時候我們可以通過 test 命令來代替執(zhí)行條件檢測,如:
if [ $var -eq 0 ]; then echo "True"; fi
# 上下等價
if test $var -eq 0; then echo "True"; fi
流程控制語句作為編程語言中至關(guān)重要的組成部分,Shell 自然也具備豐富的流程控制語句。思想都是殊途同歸,只不過寫法上有所差異,需要我們多練習和熟悉。下面我們著重介紹一下其中的條件語句和循環(huán)語句。
Shell 中的條件語句
if - else 語句
bash 中的 if-else 語句寫法比較特別,我們先從下面這個簡單的例子看起:
#!/bin/bash
math_score=94
english_score=90
sum_score=`expr $math_score + $english_score`
# if else
if [ $math_score == 100 ]; then
echo "perfect score!"
elif [ $math_score -gt 90] && [ $math_score -lt 100 ]; then
echo "good job!"
else
echo "normal score"
fi
可以看到,我們需要在 if 語句中額外添加 then
關(guān)鍵字,接著另起一行執(zhí)行當前條件下的邏輯;另外,elif
關(guān)鍵字就比較好理解了,即常見的 else-if
,需要注意的是,我們需要在 if-else 語句最后添加限定符 fi
來表示當前條件語句的結(jié)束。此外,上述的腳本程序也可以寫成如下格式:
#!/bin/bash
math_score=94
english_score=90
sum_score=`expr $math_score + $english_score`
# if else
if [ $math_score == 100 ]
then
echo "perfect score!"
elif [ $math_score -gt 90] && [ $math_score -lt 100 ]
then
echo "good job!"
else
echo "normal score"
fi
case 語句
Shell 中的 case 語句可以簡單理解為其他語言中的 switch-case
語句,即多選擇語句,適用于選擇場景較多的情況。下面,我們先看一個簡單示例:
#!/bin/bash
echo '請輸入你的數(shù)學考試成績:'
read score
case $score in
99|100) echo '太棒了!'
;;
9[0-8]) echo '很優(yōu)秀!'
;;
[6-8][0-9]) echo '表現(xiàn)的還可以!'
;;
*) echo '下次要努力!'
;;
esac
從上述示例可以看到,我們 case 語句與其他語言中的寫法也不太一樣,這里可以做出以下簡單總結(jié):
-
case $參數(shù) in
是標準寫法格式,每一個條件后需要以)
右括號來跟隨,固定格式,可以聯(lián)想記憶為 Java 當中的冒號。 - 我們可以使用固定值來作為匹配項,也可以使用
|
來分隔多個需要執(zhí)行相同邏輯的條件,或者用正則表達式來匹配。 - 每一個條件邏輯處理完要換行緊跟
;;
,可以理解為 Java 當中的break
。 - 至于最后的
*)
格式類似于 Java 中的default
關(guān)鍵字功能。 - 最終也需要添加
esac
關(guān)鍵字來表示語句的結(jié)束。 - 順帶一提,這里開頭的
read
命令用來獲取終端用戶的輸入內(nèi)容,并傳遞給score
變量。
Shell 中的循環(huán)語句
Shell 中同樣支持各種循環(huán)操作,常見的有for、while、until 等,下面我們來具體看一下它們的用法。
for 循環(huán)
Shell 中 for 循環(huán)比較簡單,示例如下:
#!/bin/bash
score_array=(89 78 99 72 100)
for score in ${score_array[@]}
do
echo "學生的成績依次是: ${score}"
done
#or
for score in 89 78 99 72 100
do
echo "學生的成績依次是: ${score}"
done
可以看到上面是兩種方式的 for 循環(huán),比較簡單,就不細說了。
while 循環(huán)
關(guān)于 while 循環(huán)的示例如下:
#!/bin/bash
number=1
while [ $number -le 8 ]
do
echo "當前數(shù)字: ${number}"
let "number++"
done
上述程序用來輸出小于等于 8 的數(shù)字,輸出結(jié)果如下:
當前數(shù)字: 1
當前數(shù)字: 2
當前數(shù)字: 3
當前數(shù)字: 4
當前數(shù)字: 5
當前數(shù)字: 6
當前數(shù)字: 7
當前數(shù)字: 8
let 命令用于執(zhí)行表達式,表達式中不需要 $
符號來修飾變量。當然,提到 while 就不得不說一下比較常用的無限循環(huán)了,其實很簡單:
#!/bin/bash
while :
do
echo '德瑪西亞,永世長存'
done
#or
while true; do
echo '德瑪西亞,永世長存'
done
until 循環(huán)
until 與 while 正好相反,它是在條件為 false 時繼續(xù)執(zhí)行,直到 true 時停止循環(huán),我們將上面的用 while 循環(huán)實現(xiàn)的輸出 1-8 數(shù)字的例子用 until 實現(xiàn)一下:
#!/bin/bash
number=1
until [[ $number -gt 8 ]]; do
echo "當前數(shù)字: ${number}"
let "number++"
done
Shell 中的函數(shù)
函數(shù)與命令的執(zhí)行結(jié)果可以作為條件語句使用。要注意的是,和 C 語言不同,shell 語言中 0 代表 true,0 以外的值代表 false。針對函數(shù),我們舉個簡單的示例:
#!/bin/bash
function calculateTotalScore() {
total_score=0
score_chinese=$1
score_math=$2
score_english=$3
total_score=`expr ${score_chinese} + ${score_math} + ${score_english}`
echo "這位學生的總分為: $total_score"
}
calculateTotalScore 92 100 89
#執(zhí)行結(jié)果:這位學生的總分為: 281
函數(shù)的傳參我們通過 $n 來獲取,最終執(zhí)行的時候只需要在函數(shù)后追加參數(shù)即可。
其他常見命令
echo
命令先前使用的時候已經(jīng)講過了,下面我們來看看與它類似的命令 printf
。
printf 命令
printf
命令使用引用文本或空格分隔的參數(shù),外面可以在 printf 中使用格式化字符串,還可以定制字符串的寬度、左右對齊方式等。我們舉個簡單的示例:
#!/bin/bash
echo "學生數(shù)學成績表:"
printf "%-6s %-6d\n" '小明' 98
printf "%-6s %-6d\n" '小紅' 89
執(zhí)行結(jié)果如下:
? Desktop ./hello_world.sh
學生數(shù)學成績表:
小明 98
小紅 89
這里的 %s
、%d
作為格式替換符,可以作為占位符,根據(jù)后續(xù)傳入的具體值來替換對應位置的符號。上述示例 %-6s
中的 -6
表示表示左對齊,沒有 -
符合則表示右對齊,任何字符都會被顯示在 6 個字符寬的字符內(nèi),如果不足則自動以空格填充,超過也會將內(nèi)容全部顯示出來。下面來看下常見的格式替換符以及其含義:
格式替換符 | 含義 | 描述 |
---|---|---|
%s | 字符串替換符 | 對應位置參數(shù)必須是字符串或者字符型,否則報錯 |
%d | 十進制整數(shù)替換符 | 對應位置參數(shù)必須是十進制整數(shù),否則報錯 |
%c | 字符替換符 | 對應位置參數(shù)必須是字符串或者字符型,否則報錯 |
%f | 浮點數(shù)替換符 | 對應位置參數(shù)必須是浮點數(shù)或整數(shù),否則報錯 |
具體的效果可以自己嘗試在腳本中編寫看下效果。此外,printf 命令中還支持轉(zhuǎn)義字符,如示例中的 /n
表示換行符,成功在終端生效了。如果沒有指定具體參數(shù)的值,那么格式替換符會被數(shù)據(jù)類型下的默認值代替,如 %s
用 NULL 代替,%d
用 0 代替。
test 命令
Shell 中的 test 命令用于檢查某個條件是否成立,它可以進行數(shù)值、字符和文件三個方面的測試。我們直接看下面示例:
#!/bin/bash
score_math=99
score_english=68
if test $[score_math] -gt $[score_english]
then
echo 'Good at math'
else
echo 'Good at english'
fi
read input_name
target_name="Tom"
if test $input_name = $target_name
then
echo 'Yes, is Tom!'
else
echo 'No, not him!'
fi
cd /Destop
if test -e ./hello_world.sh -o -e ./Frame.png
then
echo '至少有一個文件存在!'
else
echo '兩個文件都不存在'
fi
值得一提的是,除了使用 expr
來 執(zhí)行算數(shù)運算,我們也可以在 []
來實現(xiàn)算數(shù)運算,如:
#!/bin/bash
a=10
b=8
c=3
result=$[a+b*c]
echo "計算結(jié)果為: $result"
#計算結(jié)果為:34
本文關(guān)于 Shell 腳本的基礎介紹就到這里,篇幅比較長,只涉及到 Shell 中的基礎語法和用法,后續(xù)會涉及到具體應用實戰(zhàn)和高級用法補充。