全套學習資料移步至公眾號【學神來啦】
本節(jié)所講內(nèi)容:
23.1 ?expect實現(xiàn)無交互登錄
23.2 ?正則表達式
23.3 ?sed流編輯器
23.4 ?cut命令
23.5 ?實戰(zhàn)-bash腳本語法檢查和查看詳細的執(zhí)行過程
23.1 ?expect實現(xiàn)無交互登錄
expect ([?k?spekt]??期待 )是從它發(fā)展出來的。如果你想要寫一個能夠自動處理輸入輸出的腳本(如向用戶提問并且驗證密碼)又不想面對C或者Perl,那么expect是你的最好的選擇夸浅。它可以用來做一些linux下無法做到交互的一些命令操作
安裝和使用expect
[root@xuegod63 ~]# yum -y install expect
使用expect創(chuàng)建腳本的方法
1)定義腳本執(zhí)行的shell
#!/usr/bin/expect?
這里定義的是expect可執(zhí)行文件的鏈接路徑(或真實路徑)统台,功能類似于bash等shell功能
2)set timeout 30
設置超時時間便瑟,單位是秒,如果設為timeout -1 意為永不超時
3)spawn
spawn 是進入expect環(huán)境后才能執(zhí)行的內(nèi)部命令,如果沒有裝expect或者直接在默認的SHELL下執(zhí)行是找不到spawn命令的预鬓。不能直接在默認的shell環(huán)境中進行執(zhí)行主要功能,它主要的功能是給ssh運行進程加個殼赊颠,?用來傳遞交互指令格二。
4)expect
這里的expect同樣是expect的內(nèi)部命令
主要功能:判斷輸出結(jié)果是否包含某項字符串,沒有則立即返回竣蹦,否則就等待一段時間后返回蟋定,等待時間通過timeout進行設置
5)send
執(zhí)行交互動作,將交互要執(zhí)行的動作進行輸入給交互指令
命令字符串結(jié)尾要加上"\r"草添,如果出現(xiàn)異常等待的狀態(tài)可以進行核查
6)exp_continue
繼續(xù)執(zhí)行接下來的交互操作
7)interact
執(zhí)行完后保持交互狀態(tài)驶兜,把控制權(quán)交給控制臺;如果不加這一項远寸,交互完成會自動退出
8)$argv
expect 腳本可以接受從bash傳遞過來的參數(shù)抄淑,可以使用 [lindex $argv n]獲得,n從0開始驰后,分別表示第一個肆资,第二個,第三個……參數(shù)
例1:免密碼腳本通過SSH登錄服務器 ??
注:運行腳本時灶芝,要把#號后面的注釋刪除郑原,不然無法運行
[root@xuegod63 ~]# vim?ssh.exp
#!/usr/bin/expect
set ipaddr "192.168.100.63"
set name "root"
set passwd "123456"
set timeout 30#設置超時時間,單位是秒夜涕;expect超時等待的時間犯犁。默認timeout為10s。
spawn ssh $name@$ipaddr# spawn是進入expect環(huán)境后才可以執(zhí)行的expect內(nèi)部命令女器,如果沒有裝expect或者直接在shell下執(zhí)行是找不到spawn命令的酸役。這個就好比cd是shell的內(nèi)建命令,離開shell驾胆,就無法執(zhí)行cd一樣涣澡。 它主要的功能是給ssh運行進程加個殼,用來傳遞交互指令丧诺。
expect {
"yes/no" { send "yes\r";exp_continue }
"password" { send "$passwd\r" }#執(zhí)行交互動作入桂,與手工輸入密碼的動作等效。
}
expect "#"#找#這個字符串驳阎,找到就代表root登錄成功了
send "touch /root/xuegod1011.txt\r"
send "ls /etc > /root/xuegod1011.txt\r"
send "mkdir /tmp/xuegod1011\r"
send "exit\r"
expect eof#執(zhí)行完成上述命令后抗愁,退出Expect惕艳,把控制權(quán)交給控制臺,變回手工操作
[root@xuegod63 ~]# expect ssh.exp???#開始執(zhí)行
例2:對服務器批量管理(了解一下)
[root@xuegod63 ~]# vim?ip_pass.txt????#這里寫上要執(zhí)行的IP地址和root用戶密碼
192.168.1.63 ?123456
192.168.1.64 ?123456
192.168.1.65 ?123456
[root@xuegod63 ~]# vim?ssh2.exp???#編寫要執(zhí)行的操作
注:運行腳本時驹愚,要把#號后面的注釋刪除远搪,不然無法運行
#!/usr/bin/expect
set ipaddr [lindex $argv 0]??#接收第一個位置的變量
set passwd [lindex $argv 1] ?#接收第二個位置的變量
set timeout 30
spawn ssh root@$ipaddr
expect {
"yes/no" { send "yes\r";exp_continue }
"password" { send "$passwd\r" }
}
expect "#"
send "touch /root/xuegod1011.txt\r"
send "ls /etc > /root/xuegod1011.txt\r"
send "mkdir /tmp/xuegod1011\r"
send "exit\r"
expect eof
[root@xuegod63 ~]# vim?login.sh
#!/bin/bash
for ip in `awk '{print $1}' /root/ip_pass.txt`
do
pass=`grep $ip /root/ip_pass.txt|awk '{print $2}'` ?#通過grep找到這ip這一行內(nèi)容,然后通過awk找到這一行的第二列
expect /root/ssh2.exp $ip $pass
done
[root@xuegod63 ~]# sh login.sh
23.2 ?正則表達式的使用
正則表達式逢捺,又稱規(guī)則表達式谁鳍。(英語:Regular Expression [?reɡjul?] 規(guī)則的 [?iks?pre??n]?表
達 ),在代碼中常簡寫為regex劫瞳、regexp或RE)倘潜,計算機科學的一個概念。正則表達式通常被用來檢索志于、替換那些符合某個模式(規(guī)則)的文本涮因。
正則表達式不只有一種,而且LINUX中不同的程序可能會使用不同的正則表達式伺绽,如:
工具:grep ??sed ??awk
LINUX中常用的有兩種正則表達式引擎
基礎正則表達式:BRE
擴展正則表達式: ?ERE
Shell正則表達式的組成
基礎正則表達式
特別字符
$? #匹配輸入字符串的結(jié)尾位置养泡。要匹配 $ 字符本身,請使用 \$
( )? #標記一個子表達式的開始和結(jié)束位置奈应。要匹配這些字符澜掩,請使用 \( 和 \)
*? #匹配前面的子表達式零次或多次。要匹配 * 字符杖挣,請使用 \*
+? #匹配前面的子表達式一次或多次肩榕。要匹配 + 字符,請使用 \+
.? #匹配除換行符 \n 之外的任何單字符惩妇。要匹配 . 株汉,請使用 \.
[? #標記一個中括號表達式的開始。要匹配 [歌殃,請使用 \[
?? #匹配前面的子表達式零次或一次乔妈,或指明一個非貪婪限定符。要匹配 ? 字符請使用 \?
\? #將下一個字符標記為或特殊字符挺份、或原義字符褒翰、或向后引用、或八進制轉(zhuǎn)義符匀泊。例如, 'n' 匹配字符 'n'朵你。'\n' 匹配換行符各聘。序列 '\\' 匹配 "\",而 '\(' 則匹配 "("
^? #匹配輸入字符串的開始位置抡医,除非在方括號表達式中使用躲因,此時它表示不接受該字符集合早敬。要匹配 ^ 字符本身,請使用 \^
{? #標記限定符表達式的開始大脉。要匹配 {搞监,請使用 \{
|? #指明兩項之間的一個選擇。如:Y | y镰矿,要匹配 |琐驴,請使用 \| ?
定位符
^? #匹配輸入字符串開始的位置
$? #匹配輸入字符串結(jié)尾的位置
非打印字符
\n? #匹配一個換行符
\r? #匹配一個回車符
\t? #匹配一個制表符
[root@xuegod63 ~]# grep 'ro\+t' /etc/passwd
[root@xuegod63 ~]# egrep 'ro+t' ?/etc/passwd
[root@xuegod63 ~]# egrep 'ro(o)?t' ?/etc/passwd
[root@xuegod63 ~]# grep 'ro\(o\)\?t' /etc/passwd
例:統(tǒng)計/etc/ssh/sshd_config文件中除去空行和#號開頭的行的行數(shù)
[root@xuegod63 ~]# grep -v "^$" /etc/ssh/ssh_config | grep -v "^#" | wc -l
[root@xuegod63 ~]# grep -v "^$\|^#" /etc/ssh/ssh_config | wc -l ??#使用基礎正則表達式
[root@xuegod63 ~]# grep -E -v "^$|^#" /etc/ssh/ssh_config | wc -l #擴展正則表達式
[root@xuegod63 ~]# egrep -v "^$|^#" /etc/ssh/ssh_config ?| wc -l #擴展正則表達式
23.3 ?sed流編輯器
23.3.1 ?sed ?strem editor 流編輯器
sed編輯器是一行一行的處理文件內(nèi)容的。正在處理的內(nèi)容存放在模式空間(緩沖區(qū))內(nèi)秤标,處理完成后按照選項的規(guī)定進行輸出或文件的修改绝淡。
接著處理下一行,這樣不斷重復苍姜,直到文件末尾牢酵。文件內(nèi)容并沒有改變,除非你使用重定向存儲輸出衙猪。Sed主要用來自動編輯一個或多個文件馍乙;簡化對文件的反復操作;
sed也是支持正則表達式的垫释,如果要使用擴展正則加參數(shù)-r
sed的執(zhí)行過程:
(1)一次讀取一行數(shù)據(jù)
(2)根據(jù)我們提供的規(guī)則來匹配相關的數(shù)據(jù)潘拨,比如查找root
(3)按照命令修改數(shù)據(jù)流中的數(shù)據(jù),比如替換
(4)將結(jié)果進行輸出
(5)重復上面四步
23.3.2 ?如何使用
語法格式:sed ?[options] ‘[commands]’?filename
例1:
[root@xuegod63 ~]# echo "this is apple" | sed 's/apple/dog/'
this is dog
有/的時候饶号,可以使用其他界定符
[root@xuegod63 ~]# echo "this is ap/ple " | sed 's@ap/ple@dog@'
this is dog
[root@xuegod63 ~]# echo "this is ap/ple " | sed 's/ap\/ple/dog/'
this is dog
[root@xuegod63 ~]# echo "this is apple" > a.txt
[root@xuegod63 ~]# sed 's/apple/dog/' a.txt
this is dog
[root@xuegod63 ~]# cat a.txt??#發(fā)現(xiàn)并沒有修改文件
this is apple
23.3.3 ?sed命令參數(shù)詳解
選項:
-a在當前行下面插入文件
-n讀取下一個輸入行铁追,用下一個命令處理新的行而不是用第一個命令(取消默認輸出)
-e 執(zhí)行多個sed指令
-f 運行腳本
-i編輯文件內(nèi)容 ***
-i.bak 編輯的同時創(chuàng)造.bak的備份
-r使用擴展的正則表達式
命令:
i在當前行上面插入文件
c把選定的行改為新的指定的文本
p打印 ***
d刪除 ***
r/R 讀取文件/一行
w另存
s查找
y 替換
h 拷貝模板塊的內(nèi)容到內(nèi)存中的緩沖區(qū)。
H 追加模板塊的內(nèi)容到內(nèi)存中的緩沖區(qū)茫船。
g 獲得內(nèi)存緩沖區(qū)的內(nèi)容琅束,并替代當前模板塊中的文本。
G 獲得內(nèi)存緩沖區(qū)的內(nèi)容算谈,并追加到當前模板塊文本的后面
D 刪除\n之前的內(nèi)容
P 打印\n之前的內(nèi)容
替換標記:
數(shù)字:表明新文本將替換第幾處模式匹配的地方
g:表示新文本將會替換所有匹配的文本
\1:子串匹配標記涩禀,前面搜索可以用元字符集\(..\),
&:保留搜索到的字符用來替換其它字符
sed匹配字符集
^ 匹配行開始,如:/^sed/匹配所有以sed開頭的行然眼。
$ 匹配行結(jié)束艾船,如:/sed$/匹配所有以sed結(jié)尾的行。
. 匹配一個非換行符的任意字符高每,如:/s.d/匹配s后接一個任意字符屿岂,最后是d。
* 匹配0個或多個字符鲸匿,如:/*sed/匹配所有模板是一個或多個空格后緊跟sed的行爷怀。
例1:s 只替換第一個匹配到的字符,將passwd中的root用戶替換成xuegod
[root@xuegod63 ~]# cp ?/etc/passwd ??./
[root@xuegod63 ~]# ?sed 's/root/xuegod/' ??passwd | grep?xuegod
xuegod:x:0:0:root:/root:/bin/bash???#發(fā)現(xiàn)只替換了第一個匹配的root带欢,后面的沒有替換
bin:x:1:1:bin:/bin:/sbin/nologin
例2:全面替換標記g
[root@xuegod63 ~]# ?sed 's/root/xuegod/g' ??passwd ?| grep xuegod
xuegod:x:0:0:xuegod:/xuegod:/bin/bash????#全部替換了
把/etc/passwd文件每行開頭加上hello
[root@xuegod63 ~]# sed 's/^/hello /' /etc/passwd
例2: 將sed中默認的/ 定界符改成#號
[root@xuegod63 ~]# sed 's#/bin/bash#/sbin/nologin#' /etc/passwd ?| head -5
root:x:0:0:root:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
以/來做定界符:?
則需要轉(zhuǎn)義符运授,先輸入源內(nèi)容和替換內(nèi)容烤惊,然后輸入轉(zhuǎn)義符,最后輸入界定符
[root@xuegod63 ~]# sed 's/\/bin\/bash/\/sbin\/nologin/' passwd | head -5
(2)按行查找替換
寫法如下:
用數(shù)字表示行范圍吁朦;$表示最末行
用文本模式配置來過濾
例1:單行替換柒室,將第2行中bin替換成xuegod
[root@xuegod63 ~]# sed '2s/bin/xuegod/' passwd ?| head -2
root:x:0:0:root:/root:/bin/bash
xuegod:x:1:1:bin:/bin:/sbin/nologin
例2:多行替換,如果涉及到多行處理逗宜,用逗號表示行間隔雄右。 將第2行到最末行中bin替換成xuegod,$匹配行結(jié)束
[root@xuegod63 ~]# sed '2,$s/bin/xuegod/' /etc/passwd ?| more
root:x:0:0:root:/root:/bin/bash
xuegod:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sxuegod:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sxuegod/nologin
(3)d ?刪除行第2行到第4行的內(nèi)容
[root@xuegod63 ~]# cat /etc/hosts
127.0.0.1 ??localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 ????????localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.50 centos50
192.168.1.63 xuegod63
192.168.1.64 xuegod64
192.168.1.80 centos80
192.168.1.90 centos90
192.168.1.100 centos100
[root@xuegod63 ~]# ?sed '2,4d' /etc/hosts
127.0.0.1 ??localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.64 xuegod64
192.168.1.80 centos80
192.168.1.90 centos90
192.168.1.100 centos100
[root@xuegod63 ~]# sed '/192.168/d' /etc/hosts??#將包括192.168的行刪除
127.0.0.1 ??localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 ????????localhost localhost.localdomain localhost6 localhost6.localdomain6
(4)添加行
命令i(insert插入)锦溪,在當前行前面插入一行 ?i\
命令a(append附加)不脯,在當前行后面添加一行 a\
例1:插入
[root@xuegod63 ~]# echo "hello world" | sed ?'i\xuegod '
?xuegod
hello world
例2:追加
[root@xuegod63 ~]# ?echo "hello world"|sed 'a\xuegod'
hello world
xuegod
例3:在文件最后追加內(nèi)容
[root@xuegod63 ~]# ??sed '$a\192.168.100.100 xuegod100.cn'/etc/hosts
127.0.0.1 ??localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 ????????localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.63 ??xuegod63.cn
192.168.1.64 ??xuegod64.cn
192.168.1.62 ??xuegod62.cn
192.168.100.100 xuegod100.cn
例4:在文件中第2行之后,開始追加內(nèi)容
[root@xuegod63 ~]# ??sed '2a\192.168.100.100 xuegod100.cn' ??/etc/hosts
127.0.0.1 ??localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 ????????localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.100 xuegod100.cn
192.168.1.63 ??xuegod63.cn
192.168.1.64 ??xuegod64.cn
192.168.1.62 ??xuegod62.cn
例5:在文件中第2行前插入一行
[root@xuegod63 ~]# ??sed '2i\192.168.100.100 xuegod100.cn' ??/etc/hosts
127.0.0.1 ??localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.100.100 xuegod100.cn
::1 ????????localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.63 ??xuegod63.cn
192.168.1.64 ??xuegod64.cn
192.168.1.62 ??xuegod62.cn
例6:在文件中第2行到第4行之后分別追加內(nèi)容
[root@xuegod63 ~]# ?sed '2,4a\hello world' passwd?| head
[root@xuegod63 ~]# ?sed '2,4a\192.168.100.100 xuegod100.cn' ??/etc/hosts
127.0.0.1 ??localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 ????????localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.100 xuegod100.cn
192.168.1.63 ??xuegod63.cn
192.168.100.100 xuegod100.cn
192.168.1.64 ??xuegod64.cn
192.168.100.100 xuegod100.cn
192.168.1.62 ??xuegod62.cn
(5)修改行命令c (change) c\
例1:將第4行內(nèi)容改成aaa ?bbb
[root@xuegod63 ~]# cat /etc/hosts
127.0.0.1 ??localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 ????????localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.63 ??xuegod63.cn
192.168.1.65 ??xuegod64.cn
192.168.1.62 ??xuegod62.cn
[root@xuegod63 ~]# ??sed '4c\aaaaa bbbbbb' ?/etc/hosts
例2:將第2行到最后全部修改成aaaaa bbbb
[root@xuegod63 ~]# ??sed '2,$c\aaaaa bbbb' ?/etc/hosts
127.0.0.1 ??localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.65 xuegod65.cn
例3:將包括192.168.1.64行的內(nèi)容修改成192.168.100.100
[root@xuegod63 ~]# sed '/192.168.1.64/c\192.168.100.100' /etc/hosts
127.0.0.1 ??localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 ????????localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.50 centos50
192.168.1.63 xueg/od63
192.168.100.100
192.168.1.80 centos80
192.168.1.90 centos90
192.168.1.100 centos100
[root@xuegod63 ~]# sed '/192.168.1/c\192.168.100.100' /etc/hosts
127.0.0.1 ??localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 ????????localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.100
192.168.100.100
192.168.100.100
192.168.100.100
192.168.100.100
192.168.100.100
(6)打印刻诊,直接打印文件中的內(nèi)容
例1:打印第2-5行內(nèi)容
[root@xuegod63 ~]# sed-n'2,5p' /etc/hosts
::1 ????????localhost localhost.localdomain localhost6 localhost6.localdomain6
例2:輸出文件中含有games的行
[root@xuegod63 ~]# sed -n '/games/p' /etc/passwd
例3:輸出文件中games與nobody間的部分防楷,包含games與nobody
[root@xuegod63 ~]# sed -n '/games/,/nobody/p' /etc/passwd
(7)將修改或過濾出來的內(nèi)容保存到另一個文件中
例2:將passwd中的包括root字樣的行保存到 c.txt 中
[root@xuegod63 ~]# sed -n '/root/wc.txt' /etc/passwd
[root@xuegod63 ~]# cat c.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
(8)-i 對原文件修改,保存( 必會 ) ??使用場景: 替換或修改服務器配置文件
[root@xuegod63 ~]# sed-i's/root/xuegod/' ?passwd
[root@xuegod63 ~]# head -1 ?passwd
xuegod:x:0:0:root:/root:/bin/bash
修改IP地址為192.168.1.65
[root@xuegod63 ~]# sed -i 's/IPADDR=192.168.100.63/IPADDR=192.168.1.65/' /etc/sysconfig/network-scripts/ifcfg-ens33
23.4 ?cut命令
23.4.1 ?cut常用參數(shù)
cut命令用來顯示行中的指定部分则涯,刪除文件中指定字段复局。
說明:該命令有兩項功能,其一是用來顯示文件的內(nèi)容粟判,它依次讀取由參數(shù)file所指明的文件亿昏,將它們的內(nèi)容輸出到標準輸出上;其二是連接兩個或多個文件档礁,如cut f1?f2 > f3將把文件f1和fn的內(nèi)容合并起來角钩,然后通過輸出重定向符“>”的作用,將它們放入文件f3中呻澜。
語法: cut(選項)(參數(shù))
選項
-b:僅顯示行中指定范圍的字節(jié)數(shù)递礼;
-c:僅顯示行中指定范圍的字符;
-d:指定字段的分隔符羹幸,默認的字段分隔符為“TAB”脊髓;
-f:顯示指定字段的內(nèi)容;
例1:輸出系統(tǒng)中所有用戶名?
使用 -f 選項提取指定字段栅受,使用 -d 選項指定字段分隔符将硝,這里以:冒號做分隔
[root@xuegod63 ~]# cut -f1 -d ":" /etc/passwd
23.4.2 ?cut命令按列顯示
cut:可以將一串字符作為列來顯示,字符字段的記法:
N-:從第N個字節(jié)屏镊、字符依疼、字段到結(jié)尾;
N-M:從第N個字節(jié)闸衫、字符涛贯、字段到第M個(包括M在內(nèi))字節(jié)、字符蔚出、字段弟翘;
-M:從第1個字節(jié)、字符骄酗、字段到第M個(包括M在內(nèi))字節(jié)稀余、字符、字段趋翻。
上面是記法睛琳,結(jié)合下面選項將某個范圍的字節(jié)、字符指定為字段:
-b 表示字節(jié)踏烙;
-c 表示字符师骗;
-f 表示定義字段。
示例
例1:打印第1個到第3個字符:
[root@xuegod63 ~]# cut -c1-3 /etc/passwd
例2:打印前2個字符:
[root@xuegod63 ~]# cut -c-2 /etc/passwd
例3:打印從第2個字符開始到結(jié)尾:
[root@xuegod63 ~]# cut -c2- /etc/passwd
例 4:打印第1個到第3個字段:
[root@xuegod63 ~]# cut -f1-3 -d":" /etc/passwd
例 5:打印從第2個字段開始到結(jié)尾:
[root@xuegod63 ~]# cut -f2- -d":" /etc/passwd
23.5 ?實戰(zhàn)-bash腳本語法檢查和查看詳細的執(zhí)行過程
檢查語法是否有錯:
bash -v test.bash #查看bash是否存在語法錯誤
bash -x test.bash #查看bash詳細的執(zhí)行過程
[root@xuegod63 ~]# vim?a.sh
# Script to show debug of shell
#
sum=`expr $1 + $2`
echoo?$sum ??#這里故意寫錯
[root@xuegod63 ~]# bash -v a.sh
# Script to show debug of shell
#
num=`expr $1 + $2;touch abc.abc`
expr: 語法錯誤 ???#語法哪錯了讨惩? ??運行時沒有給參數(shù)
echoo $num ??#這里故意寫錯
a.sh:行4: echoo: 未找到命令
[root@xuegod63 ~]# sed -i 's/echoo/echo/' a.sh? #修改正確后
[root@xuegod63 ~]# bash-xa.sh 2 3
#查看詳細執(zhí)行過程辟癌。 注:這個腳本是真正執(zhí)行一遍,不是預執(zhí)行
++ expr 2 + 3
+ num=5
+ echo 5
-x?是調(diào)試用的荐捻,加了這個黍少,就會把腳本中的每條命令的執(zhí)行情況打印出來
更多學習資料移步公眾號【學神來啦】