2. 創建第一個 Shell 腳本
文章目錄
- 2. 創建第一個 Shell 腳本
- 2.1 什么是 Shell 腳本?
- 2.1.1 腳本開頭:告訴系統用什么程序執行
- 2.1.2 腳本注釋:給人看的 “說明書”
- 2.1.3 bash 與 sh 的區別
- 2.2 如何執行 Shell 腳本?
- 方法 1:用 bash 或 sh 命令執行(推薦新手)
- 方法 2:直接用路徑執行(需要執行權限)
- 方法 3:用 source 或。執行(影響當前終端)
- 方法 4:用輸入重定向或管道執行
- 2.3 Shell 腳本開發的規范和好習慣
- 基本規范
- 好習慣
- 2.4 綜合實驗(初次體驗shell腳本的高效率):寫一個系統檢查腳本
- 實驗流程
- 詳細步驟
- 步驟 1:創建腳本文件
- 步驟 2:編寫腳本內容
- 步驟 3:給腳本加執行權限
- 步驟 4:執行并驗證結果
2.1 什么是 Shell 腳本?
簡單來說,Shell 腳本就是把一系列 Linux 命令、Shell 控制語句(比如判斷、循環)和注釋寫到一個文件里,讓系統按順序執行。就像我們寫購物清單,一條條列好要買的東西,然后按清單去采購一樣。
在 Linux 里,推薦用 vim
編輯器寫腳本(功能比 vi
更強大)。如果習慣了輸入 vi
命令,可以給 vi
起個別名指向 vim
,這樣輸入 vi
就會自動打開 vim
,設置方法如下:
# 把別名配置寫入系統bash配置文件(/etc/bashrc),永久生效
[root@shell ~]# echo "alias vi='vim'" >> /etc/bashrc
# 讓剛寫入的配置立即生效(不用重啟終端)
[root@shell ~]# source /etc/bashrc
小貼士:
source 文件名
也可以寫成. 文件名
(一個點),作用是在當前終端直接執行文件里的命令,而不是開一個新窗口執行。這樣文件里的變量、別名等設置會直接影響當前終端。
2.1.1 腳本開頭:告訴系統用什么程序執行
一個規范的 Shell 腳本第一行必須寫清楚:用哪個程序(解釋器)來執行這個腳本。就像我們看視頻前要知道用播放器還是瀏覽器打開一樣。
在 Linux bash 編程里,通常這樣寫:
#!/bin/bash
或者
#!/bin/sh
這里的 #!
叫 “幻數”(不用記名字,知道作用就行),它的作用是告訴系統:“接下來的腳本內容,交給 #!
后面的程序(比如 /bin/bash
)來執行”。
注意:這一行必須在腳本的最頂端(第一行),如果寫在其他行,就會被當成普通注釋,不會生效。
舉個例子:
# 用vim創建一個叫script.sh的腳本
[bq@shell ~]$ vim script.sh
# 在腳本里寫兩行內容
#!/bin/bash # 第一行:指定用bash解釋器
echo "Hello World !" # 第二行:輸出一句話
在 CentOS 和 RHEL 系統里,默認的 Shell 就是 bash
,所以就算不寫第一行,系統也會用 bash
執行。但強烈建議加上,如果換了其他系統(比如默認 Shell 不是 bash
),沒這一行可能會出問題。養成規范的習慣總是好的~
2.1.2 腳本注釋:給人看的 “說明書”
腳本里 #
后面的內容都是注釋,系統不會執行,是寫給人看的。就像給代碼加備注,告訴自己或別人 “這段代碼是干嘛的”。
注釋可以單獨占一行,也可以跟在命令后面:
# 這是單獨一行的注釋:檢查磁盤使用情況
df -h # 這是跟在命令后面的注釋:顯示磁盤使用情況(人類可讀格式)
為什么要寫注釋?
如果腳本復雜,過幾個月自己可能都忘了某段代碼的作用;團隊協作時,別人也看不懂你的腳本。所以關鍵步驟一定要加注釋,盡量用英文(避免中文亂碼)。
2.1.3 bash 與 sh 的區別
很多人會問:#!/bin/bash
和 #!/bin/sh
有區別嗎?
簡單說,sh
是 bash
的 “簡化版”(軟鏈接),大部分情況下用哪個都一樣。但為了規范,推薦用 #!/bin/bash
。
可以用這個命令看 sh
和 bash
的關系:
# 查看/bin/sh是什么(結果會顯示它指向bash)
[bq@shell ~]$ ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 11月 2 17:33 /bin/sh -> bash
2.2 如何執行 Shell 腳本?
寫好腳本后,怎么讓它跑起來?Shell 腳本的執行流程很簡單:從上到下依次執行每一行命令,遇到嵌套的子腳本就先執行子腳本,再回來繼續執行父腳本。
常見的執行方法有 4 種,根據場景選著用:
方法 1:用 bash 或 sh 命令執行(推薦新手)
如果腳本沒設置執行權限,或者沒寫第一行的解釋器,用這種方法最穩妥。
# 格式:bash 腳本名 或 sh 腳本名
[bq@shell ~]$ bash script.sh # 執行script.sh,輸出Hello World!
Hello World!
方法 2:直接用路徑執行(需要執行權限)
先給腳本加 “可執行權限”,然后通過絕對路徑(全路徑)或相對路徑(當前目錄下)執行。
# 第一步:給腳本加執行權限(+x表示增加執行權限)
[bq@shell ~]$ chmod +x script.sh# 第二步:執行腳本
# 用絕對路徑(從根目錄開始的完整路徑)
[bq@shell ~]$ /home/bq/script.sh
# 用相對路徑(./表示當前目錄)
[bq@shell ~]$ ./script.sh
Hello World !
小貼士:企業里經常有人忘加執行權限導致腳本跑不了,所以如果不確定權限,用方法 1 更保險。
方法 3:用 source 或。執行(影響當前終端)
這種方法會在當前終端直接執行腳本,而不是開新進程。好處是:腳本里定義的變量、函數等,執行后在當前終端還能直接用。
# 格式:source 腳本名 或 . 腳本名(注意.后面有空格)
[bq@shell ~]$ source script.sh
Hello World !
# 等效于
[bq@shell ~]$ . script.sh
Hello World !
方法 4:用輸入重定向或管道執行
通過 “把腳本內容傳給 bash” 的方式執行,適合臨時測試腳本。
# 把script.sh的內容作為輸入傳給bash
[bq@shell ~]$ bash < script.sh
Hello World !# 用管道把腳本內容傳給bash(和上面效果一樣)
[bq@shell ~]$ cat script.sh | bash
Hello World !
2.3 Shell 腳本開發的規范和好習慣
規范不是 “必須遵守的法律”,但能讓腳本更好寫、更好改、更好合作。就像寫文章要分段、用標點,代碼也要有規矩。
基本規范
-
第一行必須指定解釋器
開頭寫上#!/bin/bash
,明確告訴系統用什么程序執行。 -
開頭加版本和版權信息
方便別人知道腳本的作者、用途、版本等,比如:#!/bin/bash # Date:16:29 2022-3-30 # 腳本創建時間 # Author:Created by bq # 作者 # Description:This script is used to check system status # 用途 # Version:2.0 # 版本號
可以修改
~/.vimrc
讓vim
自動生成這些信息(具體方法可以查 vim 配置)。 -
盡量不用中文
包括注釋,避免換個系統就亂碼。如果一定要用中文,在腳本里加export LANG="zh_CN.UTF-8"
統一字符集。 -
腳本名以 .sh 結尾
比如system_check.sh
,一眼就知道是 Shell 腳本。 -
存放在固定路徑
比如統一放在/usr/local/scripts/
,方便管理。
好習慣
-
成對符號一次性寫
像{}
[]
''
""
這些成對的符號,先寫完一對再往里面填內容,避免漏寫。比如先寫[]
,再退格在中間加內容。 -
中括號兩端留空格
寫[ 條件 ]
或[[ 條件 ]]
時,括號和內容之間至少留一個空格,比如if [ $a -eq 1 ]
(正確),別寫成if [$a -eq 1]
(錯誤)。 -
流程控制語句先寫框架
比如寫if
語句時,先把if
then
fi
框架搭好,再填內容:if 條件;then# 這里填執行內容 fi
for
循環也一樣:for 變量 in 列表;do# 這里填執行內容 done
-
用縮進讓代碼易讀
像上面的if
和for
,里面的內容縮進 2-4 個空格,一眼就能看出層次。 -
字符串變量加引號
定義字符串變量時,值用雙引號括起來(比如name="zhangsan"
),等號前后別留空格。如果需要 “原樣輸出”(不解析變量),用單引號(比如echo 'Hello $name'
會輸出Hello $name
)。命令的結果用反引號 ```或$()
括起來(比如today=$(date)
)。 -
符號用英文狀態
所有符號(引號、括號、逗號等)必須是英文的,中文符號會導致腳本報錯。
2.4 綜合實驗(初次體驗shell腳本的高效率):寫一個系統檢查腳本
實驗流程
- 創建腳本文件
system_check.sh
- 編寫腳本內容(實現文件系統、磁盤 IO、CPU、內存、網絡的檢查)
- 給腳本加執行權限
- 執行腳本并驗證結果
詳細步驟
步驟 1:創建腳本文件
用 vim
新建一個叫 system_check.sh
的文件:
[bq@shell ~]$ vim system_check.sh
步驟 2:編寫腳本內容
按 i
進入編輯模式,寫入以下內容:
#!/bin/bash
# 系統關鍵指標巡檢腳本
# 檢查內容:文件系統、磁盤IO、CPU、內存、網絡使用情況# 確保腳本以root權限運行(很多系統命令需要root才能執行)
# id -u 會返回當前用戶的ID,root用戶的ID是0
if [ "$(id -u)" -ne 0 ]; then# 若不是root,輸出錯誤信息(>&2表示把信息輸出到錯誤通道),然后退出echo "請使用root權限運行此腳本 (sudo $0)" >&2exit 1 # 退出碼1表示執行失敗
fi# 定義顏色變量(讓輸出更醒目)
RED='\033[0;31m' # 紅色:錯誤/警告
YELLOW='\033[1;33m' # 黃色:標題/重點
GREEN='\033[0;32m' # 綠色:正常/成功
NC='\033[0m' # 無顏色:重置終端顏色(避免后續輸出都帶顏色)# 輸出報告標題
echo -e "\n=============================================" # -e 允許解析轉義字符(如\n換行)
echo -e " 系統關鍵指標巡檢報告 "
echo -e " 時間: $(date "+%Y-%m-%d %H:%M:%S") " # date命令輸出當前時間
echo -e "=============================================\n"# 1. 檢查文件系統使用情況
echo -e "1. ${YELLOW}文件系統使用情況${NC}" # 用黃色顯示標題,結束后重置顏色
echo "---------------------------------------------"
# df -h:以人類可讀的格式(GB/MB)顯示磁盤使用情況
# awk命令:保留第一行表頭,其他行按第5列(使用率)從高到低排序
df -h | awk 'NR==1; NR>1 {print $0 | "sort -k5 -nr"}'# 檢查是否有文件系統使用率超過85%(預警)
echo -e "\n${YELLOW}警告: 使用率超過85%的文件系統:${NC}"
# df -P:避免輸出換行;awk處理:去掉百分號,篩選使用率>85%的行
df -P | awk 'NR>1 {gsub(/%/,""); if($5>85) print $0}'# 2. 檢查磁盤IO使用情況
echo -e "\n\n2. ${YELLOW}磁盤IO使用情況${NC}"
echo "---------------------------------------------"
# 先檢查iostat命令是否存在(需要安裝sysstat包)
if command -v iostat &> /dev/null; then # &> /dev/null表示不顯示檢查過程# iostat -x:顯示詳細IO統計;1 2:每隔1秒查1次,共查2次;tail取有效數據iostat -x 1 2 | tail -n +4
else# 若iostat不存在,提示安裝sysstatecho "未安裝sysstat包,無法獲取磁盤IO信息。請安裝:yum install sysstat 或 apt-get install sysstat"
fi# 3. 檢查CPU使用情況
echo -e "\n\n3. ${YELLOW}CPU使用情況${NC}"
echo "---------------------------------------------"
echo "總體CPU使用率:"
# top -bn1:非交互式輸出1次CPU信息;grep篩選CPU行;awk提取用戶態、系統態、空閑率
top -bn1 | grep "Cpu(s)" | awk '{printf "用戶態: %.2f%%, 系統態: %.2f%%, 空閑: %.2f%%\n", $2, $4, $8}'# 顯示各CPU核心的使用詳情
echo -e "\nCPU核心使用詳情:"
# mpstat -P ALL:顯示所有核心;1 1:查1次;tail取有效數據
mpstat -P ALL 1 1 | tail -n +4# 顯示占用CPU最高的5個進程
echo -e "\n${YELLOW}占用CPU最高的5個進程:${NC}"
# ps -eo:指定輸出格式(CPU使用率、PID、用戶、命令);--sort=-%cpu:按CPU降序;head取前5個
ps -eo %cpu,pid,user,args --sort=-%cpu | head -n 6 # 6行包含表頭# 4. 檢查內存使用情況
echo -e "\n\n4. ${YELLOW}內存使用情況${NC}"
echo "---------------------------------------------"
# free -h:人類可讀格式顯示內存和swap使用
free -h# 顯示內存詳細統計
echo -e "\n內存使用詳情:"
# vmstat -s:顯示內存相關的統計數據(總內存、空閑、緩存等)
vmstat -s# 顯示占用內存最高的5個進程
echo -e "\n${YELLOW}占用內存最高的5個進程:${NC}"
# ps -eo:輸出內存使用率、物理內存(RSS)、PID等;按內存降序;取前5個
ps -eo %mem,rss,pid,user,args --sort=-%mem | head -n 6# 5. 檢查網絡使用情況
echo -e "\n\n5. ${YELLOW}網絡使用情況${NC}"
echo "---------------------------------------------"# 顯示網絡接口流量
echo -e "\n${YELLOW}網絡接口流量:${NC}"
# 優先用ifstat,沒有則用iftop,都沒有則顯示基本網絡信息
if command -v ifstat &> /dev/null; thenifstat 1 2 # 每隔1秒查1次,共2次
elif command -v iftop &> /dev/null; thenecho "按q退出iftop查看實時流量"sleep 2 # 等2秒再執行,給用戶看提示iftop -n -t -s 5 # -n不解析主機名;-t文本模式;-s 5運行5秒退出
elseecho "未安裝ifstat或iftop,顯示網絡接口配置:"# ip -s link show:顯示接口狀態;grep篩選已啟動的接口ip -s link show | grep -A 2 "state UP"
fi# 顯示網絡連接情況(監聽的端口)
echo -e "\n${YELLOW}網絡連接統計:${NC}"
# netstat -tuln:顯示TCP/UDP監聽端口(不解析名稱);排除本地回環地址
netstat -tuln | grep -v "127.0.0.1" # 若提示netstat未找到,安裝net-tools包# 統計各狀態的TCP連接數
echo -e "\n${YELLOW}連接數統計:${NC}"
# 統計所有TCP連接的狀態(如ESTABLISHED、LISTEN等)
netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'# 巡檢完成提示
echo -e "\n\n============================================="
echo -e " 系統巡檢完成 "
echo -e "=============================================\n"
寫完后按 Esc
,輸入 :wq
保存退出。
步驟 3:給腳本加執行權限
[bq@shell ~]$ chmod +x system_check.sh
步驟 4:執行并驗證結果
用 root 權限執行(因為腳本里有檢查權限的邏輯):
[bq@shell ~]$ sudo ./system_check.sh
執行后會看到類似以下的輸出(根據系統狀態不同,數值會變化):
=============================================系統關鍵指標巡檢報告 時間: 2025-08-20 18:48:02
=============================================1. 文件系統使用情況
---------------------------------------------
文件系統 容量 已用 可用 已用% 掛載點
/dev/sda1 1014M 139M 876M 14% /boot
/dev/mapper/centos-root 50G 2.4G 48G 5% /
...警告: 使用率超過85%的文件系統:
(若沒有超過85%的,這里為空)...(后續會顯示磁盤IO、CPU、內存、網絡的檢查結果)...=============================================系統巡檢完成
=============================================
注意:如果提示
netstat: 未找到命令
,安裝net-tools
包即可(yum install net-tools
或apt-get install net-tools
)。
通過這個實驗,你可以快速掌握 Shell 腳本的基本結構、執行方法和實用命令,以后可以根據需求擴展腳本功能(比如增加郵件報警、生成報告文件等)。
如涉及版權問題,請聯系作者處理!!!!!!