一、Shell概述
1. Shell是什么?
- Shell是一個命令行解釋器,它為用戶提供了一個向Linux內核發送請求以便運行程序的界面系統級程序,用戶可以用Shell來啟動、掛起、停止甚至是編寫一些程序。
- Shell還是一個功能相當強大的編程語言,易編寫,易調試,靈活性較強。Shell是解釋執行的腳本語言,在Shell中可以直接調用Linux系統命令。
課外參考文章: 編譯執行和解釋執行的區別
2. Shell的分類
Bourne Shell: 是 UNIX 最初使用的 shell,并且在每種 UNIX 上都可以使用, 在 shell 編程方面相當優秀,但在處理與用戶的交互方面做得不如其他幾種shell。
C Shell: C Shell主要在BSD版的Unix系統中使用,其語法與C語言相類似而得名。
Shell的兩種主要語法類型有Bourne Shell和C Shell,這兩種語法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括csh、tash。
-
Bash:Bourne Again shell,它是 Bourne shell 的擴展,簡稱 Bash,與 Bourne shell 完全向后兼容,并且在Bourne shell 的基礎上增加、增強了很多特性。Bash放在/bin/bash中,它有許多特色,可以提供如命令補全、命令編輯和命令歷史表等功能,它還包含了很多 C shell 和 Korn shell 中的優點,有靈活和強大的編程接口,同時又有很友好的用戶界面。
-
查看我們當前使用的Shell:
Paste_Image.png -
查看Bash兼容哪些Shell:vi /etc/shells
Paste_Image.png -
切換不同的Shell(實際上是每切換一個就新增了一個shell。):
Paste_Image.png -
退出Shell:
Paste_Image.png
-
二、腳本執行方式
腳本,是使用一種特定的描述性語言,依據一定的格式編寫的可執行文件,又稱作宏或批處理文件。
1. echo 輸出命令
echo [選項] [輸出內容]
選項:
-e 支持反斜線控制的字符轉換
控制字符表:
| 控制字符| 作用 |
| ------------- |:-------------:| -----:|
| \a | 輸出警告音 |
| \b | 退格鍵,也就是向左刪除鍵 |
| \n | 換行符 |
| \r | 回車鍵 |
| \t | 制表符,也就是Tab鍵 |
| \v | 垂直制表符 |
| \0nnn | 按照八進制ASCII碼表輸出字符。其中0為數字0,nnn是三位八進制數 |
| \xhh | 按照十六進制ASCII碼表輸出字符。 其中hh是兩位十六進制數|
| \e[1;……\e[0m |輸出顏色,可選:30m 黑色、31m 紅色、32m 綠色、33m 黃色、34m 藍色、35m 洋紅、36m 青色、37m 白色|
下面實驗:
1. \a

2. \b
發現\b放在字符串末尾是無效的
3. \n
4. \r
5. \t
6. \v
7. \0nnn
參考:ASCII碼表
8. \xhh
9. \e[1;……\e[0m
2. 第一個腳本
1. vim(vim是vi的增強版,完全兼容vi的所有功能) xxx.sh 創建腳本文件xxx.sh
2. 進入vim編輯器,開頭聲明:
#!/bin/bash
3. echo -e "內容……"
我的XShell無法輸入小盤的數字,有同樣問題者,戳這里:xshell無法使用小鍵盤區輸入數字
3. 腳本執行
賦予執行權限,直接運行
chmod 755 xxx.sh
./xxx.sh
通過Bash調用執行腳本(無需賦予權限)
bash xxx.sh
三、Bash基本功能
** 1. 命令別名與快捷鍵**
別名,正式的或規范的名稱以外的名稱,一種事物在通常的名稱之外還有另外的一種名稱,有地方稱之為昵稱,也有地方稱之為小名。
- 查看與設定別名
alias
查看系統中所有命令的別名
其中:
alias cp='cp -i' 中-i是用來提示是否覆蓋不同節點的同名文件的。其他幾個原命令中帶-i也是同理。
alias 別名 = '原命令'
設定命令別名(系統重啟后失效)
- 別名永久生效和刪除別名
vi 用戶的家目錄/.bashrc 例如:vi ~/.bashrc
寫入環境變量配置文件
那么下邊將我之前設置的新的ll別名,寫入到我(root用戶)的環境變量配置文件。
設置完成后,下次重新登錄,這個別名就會永久生效了!??!那么。如果我想讓它直接生效呢?
source 用戶的家目錄/.bashrc
立即使/.bashrc內容生效!
unalias 別名
刪除別名(是臨時刪除,下次系統重啟后還會存在。要想徹底刪除,需要去.bashrc文件中刪除指定的別名,就會永久刪除)
-
命令生效順序
我想有很多小伙伴跟我有一樣的疑惑,剛才查看命令別名的時候,有很多別名和原命令是一樣的,例如:alias cp='cp -i',都是cp,那么執行順序是怎樣的呢?- 第一順位執行用絕對路徑或相對路徑執行的命令
(路徑絕對是第一位的) - 第二順位執行別名
(這就解釋了上邊的疑惑,同名,會先執行別名) - 第三順位執行Bash的內部命令
(例如cd,就是使用whereis找不到bin文件的,即代表是內部命令) - 第四順位執行按照$PATH環境變量定義的目錄查找順序找到的第一個命令
(除了內部命令,其他命令我們都需要到$PATH環境變量定義的目錄中查找的)
- 第一順位執行用絕對路徑或相對路徑執行的命令
-
常用快捷鍵
- ctrl+c 強制終止當前命令
(例如,ping ip時,數據一直增加,這時就可以使用ctrl+c終止此次ping) - ctrl+l 清屏
- ctrl+a 光標移動到命令行首(輸入了很長的命令,使用ctrl+a可以使光標移動到這行命令的第一個字符的位置)
- ctrl+e 光標移動到命令行尾
- ctrl+u 從光標所在位置刪除到行首(其實就是刪除整行命令)
- ctrl+z 把命令放入后臺(例如ping ip時顯示數據,懶得看,可以把它放入后臺。不過還是要謹慎使用哦)
- ctrl+r 從歷史命令中搜索
- ctrl+c 強制終止當前命令
ctrl+r不好用文字描述,截個圖看吧:
** 2. 歷史命令**
- 歷史命令
history [選項] [歷史命令保存文件]
選項:
-c 清空歷史命令
-w 把緩存中的歷史命令同步到歷史命令保存文件~/.bash_history(會覆蓋之前保存的歷史命令,而不是追加)
-
查看歷史命令
Paste_Image.png -
清空歷史命令并同步到歷史命令保存文件(歷史命令,最好不要清空,如果遇到問題,可以幫助排錯)
Paste_Image.png
歷史命令會默認保存1000條,可以在環境變量配置文件/etc/profile中進行修改。
-
歷史命令的調用
- 使用上、下箭頭調用以前的歷史命令
- 使用“!n”重復執行第n條歷史命令
- 使用"!!"重復執行上一條命令
- 使用"!字串"重復執行最后一條以該字串開頭的命令
使用“!n”重復執行第5條歷史命令:
使用"!!"重復執行上一條命令:
使用"!字串"重復執行最后一條以該字串開頭的命令:
-
命令與文件補全
- 在Bash中,命令與文件補全是非常方便與常用的功能,我們只要在輸入命令或文件時,按“Tab”鍵就會自動進行補全。
** 3. 輸入輸出重定向**
- 標準輸入輸出
設備 | 設備文件名 | 文件描述符 | 類型 |
---|---|---|---|
鍵盤 | /dev/stdin | 0 | 標準輸入 |
顯示器 | /dev/sdtout | 1 | 標準輸出 |
顯示器 | /dev/sdterr | 2 | 標準錯誤輸出 |
- 輸出重定向
linux中使用重定向符號可以實現輸出輸入重定向,默認條件下,標準輸出和錯誤輸出都是終端,用重定向符號可以把標準輸出和錯誤內容進行重定向,例如把標準輸出重定向到文件。
為什么需要重定向呢?
舉個例子。假如一個命令正在運行的時候,沒有人在電腦跟前,那么就可以把它的結果重定向到文件中,等有人的時候直接看文件中保存的數據就好了。
類型 | 符號 | 作用 |
---|---|---|
標準輸出重定向 | 命令 > 文件 | 以覆蓋的方式,把命令的正確輸出輸出到指定的文件或設備當中。 |
同上 | 命令 >> 文件 | 以追加的方式,把命令的正確輸出輸出到指定的文件或設備當中。 |
標準錯誤輸出重定向 | 錯誤命令 2>文件 | 以覆蓋的方式,把命令的錯誤輸出輸出到指定的文件或設備當中。 |
同上 | 錯誤命令 2>>文件 | 以追加的方式,把命令的錯誤輸出輸出到指定的文件或設備當中。 |
正確輸出和錯誤輸出同時保存 | 命令 >文件 2>&1 | 以覆蓋的方式,把正確輸出和錯誤輸出都保存到同一文件當中。 |
同上 | 命令 >>文件 2>&1 | 以追加的方式,把正確輸出和錯誤輸出都保存到同一文件當中。 |
同上 | 命令 &> 文件 | 以覆蓋的方式,把正確輸出和錯誤輸出都保存到同一文件當中。 |
同上 | 命令 &>> 文件 | 以追加的方式,把正確輸出和錯誤輸出都保存到同一文件當中。 |
同上 | 命令 >> 文件1 2>>文件2 | 把正確輸出追加到文件1中,把錯誤輸出追加到文件2中。 |
備注:此處的文件如果不存在那么創建,存在就覆蓋或者追加。
標準輸出重定向,覆蓋——命令 > 文件:
標準輸出重定向,追加——命令 >> 文件:
標準錯誤輸出重定向,覆蓋——命令 2> 文件:
標準錯誤輸出重定向,追加——命令 2>> 文件:
正確輸出和錯誤輸出同時保存,追加——【命令 >> 文件 2>&1】和【命令 &>> 文件】效果是一樣的:
把正確輸出追加到文件1中,把錯誤輸出追加到文件2中,命令 >> 文件1 2>>文件2:
- ** 輸入重定向**
| 類型| 符號 | 功能 |
| ------------- |:-------------:| :-----:| :-----:|
|標準輸入 |命令 < 文件 |命令把文件的內容作為標準輸入|
|標識符限定輸入 | 命令 << 標識符 |命令從標準輸入中讀入內容,直到遇到標識符位置|
|輸入輸出重定向| 命令 < 文件 > 文件2 |命令以文件1作為標準輸入,以文件2作為標準輸出|
Linux系統中的wc(Word Count)命令的功能為統計指定文件中的字節數、字數、行數,并將統計結果顯示輸出。
wc [選項] [文件名]
選項:
-c 只統計字節數
-w 只統計單詞數(只要字符之間有空格,就認識是一個單詞)
-l 只統計行數
操作步驟:
輸入wc → 回車 → 輸入內容 → Ctrl+D
wc < 文件
命令把文件的內容作為標準輸入并統計
wc << 標識符
>……
>標識符
把標識符之間的內容作為命令的輸入并統計
** 4. 管道符**
- 多命令順序執行
| 多命令執行符| 格式 | 作用 |
| ------------- |:-------------:| :-----:| :-----:|
|; |命令1 ; 命令2|多個命令順序執行,命令之間沒有任何邏輯關系|
|&& | 命令1&&命令2 |邏輯與。當命令1正確執行,命令2才會執行。命令1執行不正確,不執行命令2|
|||| 命令1||命令2 |邏輯或。當命令1執行正確,則命令2不執行。當命令1執行不正確,則命令2執行|
多個命令順序執行,命令之間沒有任何邏輯關系——【;】
邏輯與。當命令1正確執行,命令2才會執行。命令1執行不正確,不執行命令2——【&&】
邏輯或。當命令1執行正確,則命令2不執行。當命令1執行不正確,則命令2執行——【||】
綜合邏輯與和邏輯或:
- 管道符
命令1|命令2
命令1的正確輸出作為命令2的操作對象
先查處出家目錄下所有文件,然后作為命令2的操作對象,查出小于4k大于1k的文件并詳細展示:
查出當前所有的網絡連接:
以下是網絡端口的訪問情況,數據很長,暫且就截這么點吧
其中,有一條是這樣的,其他狀態時LISTEN,代表端口被監聽中。這條ESTABLISHED,代表正在連接這個端口。
22端口是誰呢?
當然是現在正在進行遠程連接的Xshell了!
通過管道符查詢當前鏈接linux的客戶端:
增強,通過管道符查詢當前鏈接linux的客戶端的人數:
** 5. Shell中通配符**
- 通配符
通配符 | 作用 |
---|---|
? | 匹配一個任意字符 |
* | 可以匹配0個或多個任意字符 |
[] | 匹配中括號中任意一個字符。 |
[-] | 匹配中括號中任意一個字符。-代表一個范圍。例如[a-z],代表可以匹配a-z之間的任意一個字符 |
[ ^ ] | 邏輯非,表示匹配不是中括號內的一個字符。例如[^0-9],代表匹配一個不是數字的字符 |
一般用在文件名稱的匹配和目錄的匹配。
- Bash中的其他符號
符號 | 作用 |
---|---|
' ' | 單引號。在單引號中所有的特殊符號,都沒有特殊含義。 |
"" | 雙引號。在雙引號中所有的特殊符號,都沒有特殊含義。但是“$”、“`”、“\”是例外,擁有“調用變量的值”、“引用命令”和“轉義符”的特殊含義。 |
`` | 反引號。反引號括起來的內容是系統命令,在Bash中會先執行它。和$()作用一樣,不過推薦使用$(),因為反引號非常容易看錯。 |
$() | 和反引號作用一樣,用來引用系統命令。 |
# | 在Shell腳本中,#號開頭的行代表注釋 |
$ | 用于調用變量的值,如需要調用變量name的值時,需要用$name的方式得到變量的值。 |
轉義符。跟在\后面的特殊符號將失去特殊意義,變為普通字符。如$將輸出$符號,而不是當作變量引用 |
這個例子,用到了單引號、雙引號、反引號、$()、$變量名: