# 一、shell基礎(chǔ)1
## 1.shell是什么
- Shell是一個(gè)命令行解釋器,它為用戶(hù)提供 了一個(gè)向Linux內(nèi)核發(fā)送請(qǐng)求以便運(yùn)行程 序的界面系統(tǒng)級(jí)程序,用戶(hù)可以用Shell來(lái) 啟動(dòng)、掛起、停止甚至是編寫(xiě)一些程序。
- Shell還是一個(gè)功能相當(dāng)強(qiáng)大的編程語(yǔ)言, 易編寫(xiě),易調(diào)試,靈活性較強(qiáng)。Shell是解釋執(zhí)行的腳本語(yǔ)言,在Shell中可以直接調(diào) 用Linux系統(tǒng)命令。
Linux支持的Shell
/etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/ksh
/bin/rksh
## 2.腳本的執(zhí)行方式
### 1.echo輸出命令
`echo 'hello word'`
選項(xiàng)? -e? 支持反斜線字符轉(zhuǎn)換;
| 控制字符 | 作用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| :------- | ------------------------------------------------------------ |
| \\? ? ? | 輸出\本身? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| \a? ? ? | 輸出警告音? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| \b? ? ? | 退格鍵,也就是向左刪除鍵? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| \c? ? ? | 取消輸出行末的換行符。和“-n”選項(xiàng)一致? ? ? ? ? ? ? ? ? ? ? ? |
| \e? ? ? | ESCAPE鍵? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| \f? ? ? | 換頁(yè)符? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| \n? ? ? | 換行符? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| \r? ? ? | 回車(chē)鍵? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| \t? ? ? | 制表符,也就是tab鍵? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| \v? ? ? | 垂直制表符? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| \0nnn? ? | 按照八進(jìn)制ASCII碼表輸出字符。其中0為數(shù)字零,nnn是三位八進(jìn)制數(shù) |
| \xhh? ? | 按照十六進(jìn)制ASCII碼表輸出字符。其中hh是兩位十六進(jìn)制數(shù)? ? ? ? |
`echo -e "a\tb\tc\nd\te\tf"`
輸出:
a b c
d e f 制表符與換行符
`echo -e “\x61\t\x62\t\x63\n\x64\t\x65\t\x66”`
輸出:
a b c
d e f 按照十六進(jìn)制ASCII碼也同樣可以輸出
`echo -e "\e[1;31m abcd \e[0m"`
輸出:
紅色的abcd
因?yàn)閈e[1 表示開(kāi)啟顏色區(qū)別 \e[0m 表示結(jié)束顏色區(qū)別 31m表示紅色 還有其他:
30m=黑色,31m=紅色,32m=綠色,33m=黃色,34m=藍(lán)色,35m=洋紅,36m=青色,37m=白色
- 腳本格式:
第一行#號(hào)不是注釋?zhuān)锹暶魇褂玫慕忉屍? `#!/bin/bash`
```shell
vim test.sh
#!/bin/bash
#程序注釋要完整可讀
echo -e "Hello Word!"
```
腳本執(zhí)行的兩種方式:
1.授權(quán)可執(zhí)行權(quán)限后用絕對(duì)路徑或相對(duì)路徑執(zhí)行;
2.bash 腳本執(zhí)行(無(wú)需權(quán)限,不常用);
## 3.bash的基本功能
### 1.歷史命令與命令補(bǔ)全
history 歷史命令補(bǔ)全
history? [選項(xiàng)]? [歷史命令保存文件]
-c:清空歷史命令(慎用)
-w:把緩存中的歷史命令寫(xiě)入文件
默認(rèn)存儲(chǔ)位置: ~/bash_history(該次登陸的命令不會(huì)在該文件中被記錄,需要-w才能保存),歷史命令默認(rèn)保存1000條,可以在/etc/profile中修改;
使用上下箭頭調(diào)用歷史命令
!n:重復(fù)執(zhí)行第n條命令;
!!:重復(fù)執(zhí)行上一條命令;
"!字符串":重復(fù)執(zhí)行最后一條以該命令開(kāi)頭的命令;
`````shell
[root@localhost ~]# !net
netstat -tlnp|grep 1521
`````
### 2.tab鍵補(bǔ)全命令
在bash中,不管是命令還是文件都可以使用tab鍵補(bǔ)全
## 2.別名與快捷鍵
### 別名
別名查詢(xún):alias
定義方式:alias 別名='原命令'
`alias? vi='vim'`
除非確實(shí)需要,否則不建議用自定義別名覆蓋現(xiàn)有命令;
用命令行定義的別名是臨時(shí)生效的,要想永久生效需要修改家目錄下的.bashrc文件;
刪除別名:unalias 別名
### bash常用快捷鍵
| 快捷鍵? ? | 作用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| ---------- | ------------------------------------------------------------ |
| Ctrl+A? ? | 把光標(biāo)移動(dòng)到命令行開(kāi)頭,如果我們輸入的命令過(guò)長(zhǎng),想要把光標(biāo)移動(dòng)到開(kāi)頭使用; |
| ctrl+E? ? | 把光標(biāo)移動(dòng)到命令行結(jié)尾? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| **ctrl+C** | 強(qiáng)制終止當(dāng)前命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| **ctrl+L** | 清屏,相當(dāng)于clear命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| **ctrl+U** | 刪除或剪切光標(biāo)之前的命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| ctrl+K? ? | 刪除或剪切光標(biāo)之后的內(nèi)容? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| **ctrl+Y** | 粘貼ctrl U 或者ctrl K 剪切的內(nèi)容? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| **ctrl+R** | 在歷史命令中搜索,按下后就會(huì)出現(xiàn)搜索界面,搜索到以后直接回車(chē)可以執(zhí)行 |
| **ctrl+D** | 退出當(dāng)前終端? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| ctrl+Z? ? | 暫停,并進(jìn)入后臺(tái)。牽扯工作管理中的內(nèi)容,后續(xù)講? ? ? ? ? ? ? |
| ctrl+S? ? | 暫停屏幕輸出? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| ctrl+Q? ? | 恢復(fù)屏幕輸出? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
加粗的為常用命令
## 3.bash輸入輸出重定向
### 1.標(biāo)準(zhǔn)輸入輸出
| 設(shè)備? | 設(shè)備文件名? | 文件描述符 | 類(lèi)型? ? ? ? |
| ------ | ----------- | ---------- | ------------ |
| 鍵盤(pán)? | /dev/stdin? | 0? ? ? ? ? | 標(biāo)準(zhǔn)輸入? ? |
| 顯示器 | /dev/sdtout | 1? ? ? ? ? | 標(biāo)準(zhǔn)輸出? ? |
| 顯示器 | /dev/sdterr | 2? ? ? ? ? | 標(biāo)準(zhǔn)錯(cuò)誤輸出 |
### 2.輸出重定向
| 類(lèi)型? ? ? ? ? ? ? | 符號(hào)? ? ? ? | 作用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| ------------------ | ----------- | ---------------------------------------------------------- |
| 標(biāo)準(zhǔn)輸出重定向? ? | 命令>文件? | 以覆蓋的方式,把命令的正確內(nèi)容輸出到到指定的文件或設(shè)備中; |
| 標(biāo)準(zhǔn)輸出重定向? ? | 命令>>文件? | 以追加的方式,把命令的正確內(nèi)容輸出到到指定的文件或設(shè)備中; |
| 標(biāo)準(zhǔn)錯(cuò)誤輸出重定向 | 命令2>文件? | 以覆蓋的方式,把命令的錯(cuò)誤內(nèi)容輸出到到指定的文件或設(shè)備中; |
| 標(biāo)準(zhǔn)錯(cuò)誤輸出重定向 | 命令2>>文件 | 以追加的方式,把命令的錯(cuò)誤內(nèi)容輸出到到指定的文件或設(shè)備中; |
不在將命令執(zhí)行的結(jié)果顯示在命令行中,而是輸出在文件中,就叫命令的輸出重定向;
通常工作中這種分開(kāi)輸出的方式不常用:
```shell
date >>? test.txt #將正確命令追加到test
dateaaa 2>> test.txt #將錯(cuò)誤命令追加到test
```
常用方式為正確和錯(cuò)誤命令同時(shí)輸出:
|? ? ? ? ? ? ? ? ? ? ? |? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| --------------------- | -------------------------------------------------------- |
| 命令 > 文件 2>&1? ? ? | 以覆蓋方式,把正確輸出和錯(cuò)誤輸出都保存到同一個(gè)文件當(dāng)中; |
| 命令>> 文件2>&1? ? ? | 以追加方式,把正確輸出和錯(cuò)誤輸出都保存到同一個(gè)文件當(dāng)中; |
| 命令&>文件? ? ? ? ? ? | 以覆蓋方式,把正確輸出和錯(cuò)誤輸出都保存到同一個(gè)文件當(dāng)中; |
| 命令&>>文件? ? ? ? ? | 以追加方式,把正確輸出和錯(cuò)誤輸出都保存到同一個(gè)文件當(dāng)中; |
| 命令>>文件1? 2>>文件2 | 以追加方式,把正確的輸出到文件1,錯(cuò)誤的輸出到文件2;? ? |
例如:
```shell
dateaaa &>> test.txt
date &>> test.txt
```
正確和錯(cuò)誤的輸出都會(huì)追加到test.txt文件中
執(zhí)行命令不保存輸出結(jié)果:
`ls &>/dev/null`
/dev/null類(lèi)似垃圾箱,無(wú)法查詢(xún)內(nèi)容。
### 3.輸入重定向
`wc [選項(xiàng)] [文件名]`
-c 統(tǒng)計(jì)字節(jié)數(shù)
-w 統(tǒng)計(jì)單詞數(shù)
-l 統(tǒng)計(jì)行數(shù)
用的情況不多,統(tǒng)計(jì)命令或文件中的信息。
## 4.多命令順序執(zhí)行和管道符
### 1.多命令順序執(zhí)行
| 多命令執(zhí)行符 | 格式? ? ? ? ? | 作用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| ------------ | -------------- | ------------------------------------------------------------ |
| ;? ? ? ? ? ? | 命令1;命令2? ? | 多個(gè)命令順序執(zhí)行,命令之間沒(méi)有任何邏輯聯(lián)系? ? ? ? ? ? ? ? ? |
| &&? ? ? ? ? | 命令1&&命令2? | 邏輯與<br />當(dāng)命令1正確執(zhí)行,則命令2才會(huì)執(zhí)行<br />當(dāng)命令1執(zhí)行不正確,則命令2不會(huì)執(zhí)行 |
| \|\|? ? ? ? | 命令1\|\|命令2 | 邏輯或<br />當(dāng)命令1執(zhí)行不正確,則命令2才會(huì)執(zhí)行<br />當(dāng)命令1正確執(zhí)行,則命令2不會(huì)執(zhí)行 |
舉例:
```shell
ls;date;cd /asdf; cd #命令之間不互相干擾
ll && echo yes || echo no? #判斷命令是否正確執(zhí)行,ll執(zhí)行成功后邏輯與&&生效,然后執(zhí)行echo yes,邏輯或||失效,不執(zhí)行echo no;
```
### 2.管道符
命令格式:
命令1 | 命令2
#命令1的正確輸出作為命令2的操作對(duì)象,例如:
```shell
ll -a /etc | more
netstat -tlnp|grep 1521
```
grep作用:
grep? 【選項(xiàng)】 "搜索內(nèi)容"? 文件名
`grep "root" /etc/passwd`
選項(xiàng):
-i:忽略大小寫(xiě)
-n:輸出行號(hào)
-v:反向查找
--color=auto:搜索出的內(nèi)容用顏色顯示
## 5.通配符和其他特殊符號(hào)
### 1.通配符
| 通配符 | 作用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| ------ | ------------------------------------------------------------ |
| ?? ? | 匹配任意一個(gè)字符? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| *? ? ? | 匹配0個(gè)或任意多個(gè)字符,也就是匹配? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| []? ? | 匹配括號(hào)中任意**一個(gè)**字符,例如[abc]代表一定匹配一個(gè)字符,或是a、或是b、或是c; |
| [-]? ? | 匹配括號(hào)中任意**一個(gè)**字符,-代表一個(gè)范圍。例如[a-z] 代表匹配任意一個(gè)小寫(xiě)字母; |
| [^]? ? | 邏輯非,表示匹配不是括號(hào)里的**一個(gè)**字符。例如:`[^0-9]`代表匹配一個(gè)不是數(shù)字的字符。 |
中括號(hào)只能匹配一個(gè)字符;
### 2.bash中的其他特殊符號(hào)
| 符號(hào) | 作用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| ---- | ------------------------------------------------------------ |
| ‘’? | 單引號(hào)。在單引號(hào)中所有的特殊符號(hào),如“$“和”·“(反引號(hào))都沒(méi)有特殊含義; |
| ”“? | 雙引號(hào)。在雙引號(hào)中特殊符號(hào)都沒(méi)有特殊含義,但是“$“和”·“和\都是例外,擁有調(diào)用變量的值、引用命令、轉(zhuǎn)義符的特殊含義 |
| ··? | 反引號(hào)。反引號(hào)括起來(lái)的內(nèi)容是系統(tǒng)命令,在bash中會(huì)先執(zhí)行它,和$()作用一樣,不過(guò)推薦使用$(),反引號(hào)容易看錯(cuò)。 |
| $()? | 引用系統(tǒng)命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| #? ? | shell腳本中#號(hào)開(kāi)頭的是注釋? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| $? ? | 用于調(diào)用變量的值,如果需要調(diào)用name變量的值時(shí),需要用$name調(diào)用 |
| \? ? | 轉(zhuǎn)義符,跟在\后的特殊符號(hào)將失去特殊含義,變?yōu)槠胀ㄗ址?lt;br />如輸出`\$`將輸出$,而不是變量的引用。 |
例如:
```shell
#單引號(hào)和雙引號(hào)的區(qū)別
name=eajon
echo $name
echo '$name'
echo "$name"
#反引號(hào)和$()的作用:
abc=`date`
echo $abc
abcd=$(date)
echo $abcd
```
# 二、shell基礎(chǔ)2
## 1.bash變量
變量分類(lèi):
用戶(hù)自定義變量
環(huán)境變量:這種變量主要保存的是系統(tǒng)和操作環(huán)境相關(guān)的數(shù)據(jù);
位置參數(shù)變量:這種變量主要是用來(lái)向腳本中傳遞參數(shù)或數(shù)據(jù)的,變量名不能自定義,變量作用是固定的;
預(yù)定義變量:是bash中已經(jīng)定義好的變量,變量名不能自定義,作用也是固定的;
### 1.用戶(hù)自定義變量
變量設(shè)置規(guī)則:
可以由字母數(shù)字和下劃線組成,但是不能以數(shù)字開(kāi)頭,比如2name是個(gè)錯(cuò)誤的變量名;
在bash中,變量的默認(rèn)類(lèi)型都是字符串類(lèi)型的,如果要進(jìn)行數(shù)字運(yùn)算,則必須指定變量類(lèi)型為數(shù)值型;
變量由等號(hào)連接值,等號(hào)左右兩側(cè)不能有空格;
變量的值有空格,需要用單引號(hào)或者雙引號(hào)將這個(gè)值包含;
在變量的值中,可以使用\ 轉(zhuǎn)義符;
如果需要增加變量的值,可以進(jìn)行變量的疊加,不過(guò)需要用雙引號(hào)包含"$變量名"或用${變量}包含;
可以把命令的結(jié)果作為值,$(命令);
環(huán)境變量名建議大寫(xiě),便于區(qū)分;
```shell
aa=123 #變量的定義
echo $aa #變量調(diào)用
aa=${aa}456 #變量的疊加
aa="$aa"789 #變量的疊加
echo $aa
set? #查看系統(tǒng)所有變量
unset 變量名 #刪除變量
```
### 2.環(huán)境變量
用戶(hù)自定義變量只在當(dāng)前的shell中生效,而環(huán)境變量會(huì)在當(dāng)前shell和這個(gè)shell所有的子shell當(dāng)中生效;如果把環(huán)境變量寫(xiě)入配置文件,那么這個(gè)環(huán)境變量會(huì)在所有的shell中生效。
環(huán)境變量的設(shè)置:
```shell
export 變量名=變量值
env #查詢(xún)變量
unset 刪除變量
```
系統(tǒng)常見(jiàn)環(huán)境變量:
PATH:系統(tǒng)查找命令的路徑,tab的補(bǔ)全功能也是在path中搜索補(bǔ)全的;
PS1:定義系統(tǒng)提示符的變量
### 3.位置參數(shù)變量
| 位置參數(shù)變量 | 作用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| ------------ | ------------------------------------------------------------ |
| $n? ? ? ? ? | n為數(shù)字,$0代表命令本身,$1~$9代表第一個(gè)到第九個(gè)參數(shù),10以上的需要用大括號(hào)括起來(lái),如:${10} |
| $*? ? ? ? ? | 這個(gè)變量代表命令行中的所有參數(shù),$*把所有參數(shù)看做一個(gè)整體;? |
| $@? ? ? ? ? | 這個(gè)變量也代表命令行中的所有參數(shù),不過(guò)$@把每個(gè)參數(shù)區(qū)分對(duì)待? |
| $#? ? ? ? ? | 這個(gè)變量代表命令行中所有參數(shù)的個(gè)數(shù)? ? ? ? ? ? ? ? ? ? ? ? ? |
```shell
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
./canshu.sh? 11? 12? 13 #調(diào)用位置參數(shù)
======================================
#!/bin/bash
echo $@
echo $#
echo $*
#傳入?yún)?shù)調(diào)用
./canshu2.sh 11 22 33? 44? 666
5
11 22 33 44 666
11 22 33 44 666
```
### 4.預(yù)定義變量
| 預(yù)定義變量 | 作用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| ---------- | ------------------------------------------------------------ |
| $?? ? ? ? | 最后一次執(zhí)行命令的返回狀態(tài)。如果這個(gè)變量值為0,證明上一個(gè)命令正確執(zhí)行;<br />如果這個(gè)變量的值非0,則證明上一個(gè)命令執(zhí)行不正確; |
| $$? ? ? ? | 當(dāng)前進(jìn)程號(hào)(PID)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| $!? ? ? ? | 后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程的進(jìn)程號(hào)(PID)? ? ? ? ? ? ? ? ? ? ? ? |
多命令執(zhí)行中的邏輯與或者邏輯非就是通過(guò)$?來(lái)判斷的;
接收鍵盤(pán)輸入:
read [選項(xiàng)]? [變量名]
選項(xiàng):
-p: 提示信息,在等待read輸入時(shí),輸出提示信息;
-t:read命令會(huì)一直等待用戶(hù)輸入,使用此選項(xiàng)可以指定時(shí)間;
-n:字符數(shù):read命令只要接受指定的字符數(shù),就會(huì)執(zhí)行;
-s:隱藏輸入的數(shù)據(jù),適用于機(jī)密信息的輸入
## 2.數(shù)值運(yùn)算與運(yùn)算符
### 1.declare聲明變量類(lèi)型
declare [+/-]? [選項(xiàng)]? 變量名
選項(xiàng):
-:給變量設(shè)定類(lèi)型屬性
+:取消變量的類(lèi)型屬性
-i:將變量聲明為整數(shù)型
-x:將變量聲明為環(huán)境邊浪
-p:顯示指定變量的被聲明類(lèi)型
### 2.數(shù)值運(yùn)算的方法:
```shell
declare -i cc=$aa+$bb #使用declare聲明
dd=$(expr $aa + $bb) #使用expr,加號(hào)兩端必須有空格
ff=$(($aa+$bb)) #使用雙括號(hào)括起來(lái),最常用最直觀
```
運(yùn)算優(yōu)先級(jí)類(lèi)似數(shù)學(xué),可以通過(guò)小括號(hào)調(diào)整
### 3.運(yùn)算符
shell支持的運(yùn)算符:
優(yōu)先級(jí)越高的越先執(zhí)行,可以通過(guò)()調(diào)整
| 運(yùn)算符 | 優(yōu)先級(jí)? ? ? | 說(shuō)明? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| ------ | ----------- | ---------------------------------- |
| 13? ? | -,+? ? ? ? | 單目負(fù)、單目正? ? ? ? ? ? ? ? ? ? |
| 12? ? | !,~? ? ? | 邏輯非、按位取反或補(bǔ)碼? ? ? ? ? ? |
| 11? ? | *? /? %? ? | 乘、除、取模? ? ? ? ? ? ? ? ? ? ? |
| 10? ? | +, -? ? ? ? | 加、減? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| 9? ? ? | << ,? >>? ? | 按位左移、按位右移? ? ? ? ? ? ? ? |
| 8? ? ? | <= ,>=, <,> | 小于或等于、大于或等于、小于、大于 |
| 7? ? ? | ==,!=? ? ? | 等于、不等于? ? ? ? ? ? ? ? ? ? ? |
| 6? ? ? | &? ? ? ? ? | 按位與? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| 5? ? ? | ^? ? ? ? ? | 按位異或? ? ? ? ? ? ? ? ? ? ? ? ? |
| 4? ? ? | \|? ? ? ? ? | 按位或? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| 3? ? ? | &&? ? ? ? ? | 邏輯與? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| 2? ? ? | \|\|? ? ? ? | 邏輯或? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| 1? ? ? | =,+=,-=? ? | 賦值,運(yùn)算且賦值? ? ? ? ? ? ? ? ? |
## 3.變量測(cè)試與內(nèi)容替換
### 變量置換參考
| 變量置換方式 | 變量y沒(méi)有設(shè)置? ? ? ? ? ? | 變量y為空值? ? ? ? ? ? ? | 變量y設(shè)置了值? ? |
| ------------ | ------------------------ | ------------------------ | ----------------- |
| x=${y-新值}? | x=新值? ? ? ? ? ? ? ? ? | x為空? ? ? ? ? ? ? ? ? ? | x=$y? ? ? ? ? ? ? |
| x=${y:-新值} | x=新值? ? ? ? ? ? ? ? ? | x=新值? ? ? ? ? ? ? ? ? | x=$y? ? ? ? ? ? ? |
| x=${y+新值}? | x為空? ? ? ? ? ? ? ? ? ? | x=新值? ? ? ? ? ? ? ? ? | x=新值? ? ? ? ? ? |
| x=${y:+新值} | x為空? ? ? ? ? ? ? ? ? ? | x為空? ? ? ? ? ? ? ? ? ? | x=新值? ? ? ? ? ? |
| x=${y=新值}? | x=新值<br />y=新值? ? ? | x為空<br />y值不變? ? ? | x=$y<br />y值不變 |
| x=${y:=新值} | x=新值<br />y=新值? ? ? | x=新值<br />y=新值? ? ? | x=$y<br />y值不變 |
| x=${y?新值}? | 新值輸出到<br />錯(cuò)誤輸出 | x為空? ? ? ? ? ? ? ? ? ? | x=$y? ? ? ? ? ? ? |
| x=${y:?新值} | 新值輸出到<br />錯(cuò)誤輸出 | 新值輸出到<br />錯(cuò)誤輸出 | x=$y? ? ? ? ? ? ? |
## 4.環(huán)境變量
### 1.環(huán)境變量配置文件簡(jiǎn)介
#### 1.source命令
source 配置文件或? . 配置文件(點(diǎn)是source的縮寫(xiě))
使修改了環(huán)境變量的配置文件生效
#### 2.環(huán)境變量配置文件簡(jiǎn)介:
環(huán)境變量配置文件中主要是定義對(duì)系統(tǒng)的操作環(huán)境生效的系統(tǒng)默認(rèn)環(huán)境變量,比如PATH、HISTSIZE、PS1、HOSTNAME等默認(rèn)環(huán)境變量。
```shell
/etc/profile
/etc/profile.d/*.sh
~/.bash_profile
~/.bashrc
/etc/bashrc
```
etc下配置的環(huán)境變量每個(gè)用戶(hù)登錄都有效,家目錄下的環(huán)境變量只對(duì)自己用戶(hù)生效;
### 2.環(huán)境變量配置文件作用
# 三、shell編程
## 1.正則表達(dá)式
正則表達(dá)式用來(lái)在文件中匹配符合條件的字符串,正則是包含匹配。grep、awk、sed等命令可以支持正則表達(dá)式;
基礎(chǔ)正則表達(dá)式:
| 元字符? ? | 作用? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| --------- | ------------------------------------------------------------ |
| *? ? ? ? | 前一個(gè)字符匹配0次或任意多次;<br />匹配0次無(wú)意義? ? ? ? ? ? |
| .? ? ? ? | 匹配除了換行符的任意一個(gè)字符(相當(dāng)于通配符的?);<br />s..d 代表s和d中間有兩個(gè)字符 |
| ^? ? ? ? | 匹配行首。例如:^hello會(huì)匹配以hello開(kāi)頭的行? ? ? ? ? ? ? ? ? |
| $? ? ? ? | 匹配行尾。例如hello$會(huì)匹配以hello結(jié)尾的行? ? ? ? ? ? ? ? ? ? |
| []? ? ? ? | 匹配括號(hào)中的一個(gè)字符,只匹配一個(gè)字符。<br />例如:`[0-9][a-z]`可以匹配一個(gè)數(shù)字和一個(gè)字母構(gòu)成的兩位字符 |
| [^]? ? ? | 匹配除括號(hào)的字符以外的一個(gè)字符。<br />例如:`[^0-9]`匹配一位非數(shù)字字符 |
| \? ? ? ? | 轉(zhuǎn)義符,用于取消特殊符號(hào)的含義? ? ? ? ? ? ? ? ? ? ? ? ? ? ? |
| `\{n\}`? | 表示前面的字符剛好出現(xiàn)n次。<br />例如:`[1][3-9][0-9]\{9\}`匹配手機(jī)號(hào)碼。 |
| `\{n,\}`? | 表示其前面的字符出現(xiàn)不小于n次。<br />例如:`[0-9]\{3\}`表示三位及以上的數(shù)字 |
| `\{n,m\}` | 表示前面的字符至少出現(xiàn)n次,至多出現(xiàn)m次。<br />例如:`[a-z]\{2,8\}`匹配2-8位的小寫(xiě)字母 |
常用:
```shell
.*: a.*b 代表匹配任何a開(kāi)頭 b結(jié)尾的字符串;
^$: “^$” 代表匹配空白行,通常加-n選項(xiàng)附帶行號(hào),方便區(qū)分
grep? -n "^$" test.txt
```
## 2.字符截取命令
### 1.cut字段提取命令
只支持提取的列是由制表符,單個(gè)符號(hào)分隔的,進(jìn)行簡(jiǎn)單的分隔:
```shell
cut [選項(xiàng)] 文件名
-f? 列號(hào) :? 提取第幾列
-d? 分隔符 : 按照指定的分隔符分隔
例如:
cut -f 3,5? -d? , #取第三列和第五列,列與列之間以逗號(hào)分隔
```
### 2.printf命令
格式化打印命令
```shell
printf `輸出類(lèi)型和格式`? 輸出內(nèi)容
輸出類(lèi)型:
%ns:? ? 輸出字符串,n是指輸出幾個(gè)字符;
%ni:? 輸出整數(shù),n代表輸出幾個(gè)數(shù)字;
%m,nf? 輸出浮點(diǎn)數(shù),m和n是數(shù)字,指輸出的整數(shù)位數(shù)和小數(shù)位數(shù):如 %8.2f代表共輸出8位數(shù),其中6位整數(shù),2位小數(shù)
例如:printf? '%s\t%s\t%s\t%s\t%s\t%s\t%s\t\n'? $(netstat -tlnp|grep 1521)
```
在awk命令的輸出中支持print和printf命令
print:print會(huì)在每個(gè)輸出之后自動(dòng)加入一個(gè)換行符(Linux默認(rèn)沒(méi)有print命令)
printf:printf是標(biāo)準(zhǔn)格式輸出命令,并不會(huì)自動(dòng)加入換行符,如果需要換行,需要手工加入換行符
### 3.awk命令
語(yǔ)法:
通過(guò)判斷條件執(zhí)行動(dòng)作
```shell
awk '條件1{動(dòng)作1} 條件2 {動(dòng)作2}' ...? 文件名
```
- 條件(pattern):
? 一般使用關(guān)系表達(dá)式作為條件:
? x > 10 判斷變量是否大于10
- 動(dòng)作 (action):
? 格式化輸出;
? 流程控制語(yǔ)句
```shell
awk與命令使用管道符結(jié)合使用:
netstat -tlnp|grep 1521 | awk '{print $7}'
awk與文件結(jié)合使用:
awk '{print $7}' test.txt
查找指定進(jìn)程pid流程
netstat -tlnp|grep 1521? | awk '{print $7}' |cut -f 1? -d /
殺指定pid的進(jìn)程
kill -9 $(netstat -tlnp|grep 8080 | awk '{print $7}'| cut -f 1 -d /)
```