shell腳本學(xué)習(xí)

# 一、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 /)

```

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近開(kāi)始系統(tǒng)學(xué)習(xí)shell腳本的相關(guān)知識(shí),為了對(duì)已經(jīng)學(xué)習(xí)的知識(shí)及時(shí)鞏固,也為別人提供參考的資料,這里會(huì)對(duì)自...
    滌除而玄覽閱讀 346評(píng)論 0 0
  • shell腳本編程 shell腳本 協(xié)程,協(xié)程可以同時(shí)做兩件事。它在后臺(tái)生成一個(gè)子shell,并在這個(gè)子shell...
    Ileo_km閱讀 343評(píng)論 0 0
  • [TOC] 簡(jiǎn)介: Shell 是一個(gè)用C語(yǔ)言編寫(xiě)的程序,它是用戶(hù)使用Linux的橋梁。Shell既是一種命令語(yǔ)言...
    黃海濱_x閱讀 933評(píng)論 0 2
  • 學(xué)習(xí)shell腳本前先對(duì)linux的基本常用知識(shí)點(diǎn)介紹一下。 linux系統(tǒng)介紹linux由四個(gè)部分組成,分別是l...
    滌除而玄覽閱讀 388評(píng)論 0 0
  • 上一節(jié)的內(nèi)容都是從上到下執(zhí)行的順序語(yǔ)句,本節(jié)介紹shell中的分支語(yǔ)句,滿(mǎn)足一些邏輯判斷的使用。shell中分支語(yǔ)...
    滌除而玄覽閱讀 408評(píng)論 0 0

友情鏈接更多精彩內(nèi)容