一、Shell 脚本基础
- 脚本结构
Shebang 行:指定解释器,如 #!/bin/bash,确保跨环境兼容性。
注释:以 # 开头,用于代码说明。
执行权限:通过 chmod +x script.sh 赋予执行权限。 - 变量
定义规则:
bash
VAR_NAME=value # 等号两侧无空格
readonly PI=3.14 # 只读变量
export PATH=“$PATH:/usr/local/bin” # 全局变量
变量类型:
字符串:str=“Hello World”
数值:num=10(默认为字符串,需用 $((…)) 或 expr 运算)。
特殊变量:
$0:脚本名称, 1 :第一个参数, 1:第一个参数, 1:第一个参数,#:参数总数,$?:上一命令退出码。
二、流程控制与逻辑
- 条件判断
基本语法:
bash
if [ -f “file.txt” ]; then
echo “文件存在”
elif [[ $var -gt 10 ]]; then
echo “变量大于10”
else
echo “其他情况”
fi
测试命令:
-d(目录)、-e(存在)、-r(可读)。
字符串比较:[[ $str == “abc” ]],数值比较:[ $a -eq $b ]。 - 循环结构
for 循环:
bash
for file in *.txt; do
echo “处理文件: f i l e " d o n e w h i l e 循环: b a s h w h i l e r e a d l i n e ; d o e c h o " 读取行: file" done while 循环: bash while read line; do echo "读取行: file"donewhile循环:bashwhilereadline;doecho"读取行:line”
done < input.txt
until 循环:
bash
until [ c o u n t − g e 5 ] ; d o e c h o " 计数: count -ge 5 ]; do echo "计数: count−ge5];doecho"计数:count"
count=$((count+1))
done
三、函数与模块化
- 函数定义
基本语法:
bash
function backup() {
local src=$1
local dest= 2 c p − r " 2 cp -r " 2cp−r"src" “$dest”
}
backup /home/user/data /backup
参数传递:通过 $1, 2 接收参数, 2 接收参数, 2接收参数,# 获取总数。 - 返回值与作用域
返回值:通过 return 或 echo 输出。
局部变量:使用 local 声明,避免污染全局命名空间。
四、高级功能与技巧
- 命令替换与管道
命令替换:
bash
current_dir= ( p w d ) f i l e c o u n t = (pwd) file_count= (pwd)filecount=(ls | wc -l)
管道与重定向:
bash
cat log.txt | grep “error” > error.log # 过滤并保存
echo “日志内容” 2>&1 | tee output.log # 合并标准输出与错误 - 进程管理
后台运行:./script.sh &,jobs 查看后台任务。
信号控制:kill -9 PID 强制终止,trap 捕捉信号。 - 文本处理
AWK:
bash
awk ‘/error/ {print $2}’ log.txt # 提取含 “error” 的第二列
Sed:
bash
sed ‘s/old/new/g’ file.txt # 全局替换
五、错误处理与调试
- 退出码与日志
检查退出码:
bash
command
if [ $? -ne 0 ]; then
echo “命令执行失败”
fi
日志记录:
bash
exec > >(tee -a script.log) 2>&1 # 重定向所有输出到日志 - 调试技巧
启用调试模式:set -x 打印执行流程。
严格模式:set -euo pipefail 防止静默失败。
六、最佳实践与规范
- 代码规范
命名规范:变量小写下划线(如 user_name),函数动词开头(如 validate_input)。
模块化:将常用功能拆分为独立脚本或函数库。 - 安全性
避免硬编码:敏感信息通过环境变量或加密文件传递。
输入验证:使用正则表达式过滤非法字符。 - 性能优化
减少子进程:优先使用内置命令(如 echo 替代 printf)。
流式处理:大文件时避免一次性加载到内存。
七、实战案例
- 自动化备份脚本
bash
#!/bin/bash
SOURCE=“/data”
BACKUP_DIR=“/backup/$(date +%Y%m%d)”
mkdir -p $BACKUP_DIR
rsync -avz --delete $SOURCE/ B A C K U P D I R / e c h o " 备份完成: BACKUP_DIR/ echo "备份完成: BACKUPDIR/echo"备份完成:BACKUP_DIR" | mail -s “每日备份” admin@example.com - 日志监控脚本
bash
#!/bin/bash
LOG_FILE=“/var/log/app.log”
tail -f L O G F I L E ∣ w h i l e r e a d l i n e ; d o i f e c h o " LOG_FILE | while read line; do if echo " LOGFILE∣whilereadline;doifecho"line" | grep -q “ERROR”; then
echo “ ( d a t e ) − 发现错误: (date) - 发现错误: (date)−发现错误:line” | mail -s “紧急错误” dev-team@example.com
fi
done
七、实战案例
一、系统管理类
- 服务器硬件信息采集脚本
功能:一键获取 CPU、内存、磁盘、网卡、GPU 等硬件信息,支持颜色高亮显示。
代码片段:
bash
#!/bin/bash
#定义颜色变量(引用自1)
green=‘\033[0;32m’
yellow=‘\033[1;33m’
red=‘\033[0;31m’
nc=‘\033[0m’
#获取 CPU 物理核心数(引用自1)
cpu_cores=$(lscpu | grep ‘Socket(s)’ | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲') echo -e "{yellow}CPU 物理核心数:
c
p
u
c
o
r
e
s
cpu_cores
cpucores{nc}"
#获取 GPU 信息(引用自1)
if command -v nvidia-smi &> /dev/null; then
gpu_count=
(
n
v
i
d
i
a
−
s
m
i
−
l
∣
w
c
−
l
)
e
c
h
o
−
e
"
(nvidia-smi -l | wc -l) echo -e "
(nvidia−smi−l∣wc−l)echo−e"{yellow}GPU 数量:
g
p
u
c
o
u
n
t
gpu_count
gpucount{nc}"
fi
应用场景:服务器巡检、硬件故障排查。
- 自动化备份脚本
功能:定时备份指定目录,压缩后存储并清理旧备份(引用自)。
代码片段:
bash
#!/bin/bash
SOURCE_DIR=“/var/www/data”
BACKUP_DIR=“/backup”
TIMESTAMP=
(
d
a
t
e
+
t
a
r
−
c
z
f
"
(date +%Y%m%d-%H%M%S) tar -czf "
(date+tar−czf"BACKUP_DIR/backup_$TIMESTAMP.tar.gz" -C $SOURCE_DIR .
#清理 30 天前备份(引用自9)
find $BACKUP_DIR -mtime +30 -exec rm {} ;
优化建议:
添加远程同步(参考的 rsync 配置)。
集成阿里云 OSS 上传(参考的 OSS 工具)。
二、日志处理类
3. 实时错误日志监控与报警
功能:监控日志文件中的 ERROR 关键词,触发邮件告警(引用自)。
代码片段:
bash
#!/bin/bash
LOG_PATH=“/var/log/nginx/error.log”
ALERT_EMAIL=“admin@example.com”
tail -fn0
L
O
G
P
A
T
H
∣
w
h
i
l
e
r
e
a
d
l
i
n
e
;
d
o
i
f
e
c
h
o
"
LOG_PATH | while read line; do if echo "
LOGPATH∣whilereadline;doifecho"line" | grep -q “ERROR”; then
echo “[$(date)] 检测到错误: $line” | mail -s “服务异常告警” $ALERT_EMAIL
fi
done
扩展功能:
添加钉钉/企业微信机器人通知(需调用 API)。
统计错误频率并生成日报(参考的 awk 统计)。
4. 日志切割与归档
功能:按天分割日志文件并压缩,保留最近 7 天数据(引用自)。
代码片段:
bash
#!/bin/bash
LOG_DIR=“/app/logs”
DATE=KaTeX parse error: Expected group after '_' at position 50: …g /app/logs/app_̲DATE.log
find $LOG_DIR -name “app_*.log” -mtime +7 -exec gzip {} ;
优化建议:
使用 logrotate 替代手动脚本(参考的滚动机制)。
三、网络与安全类
5. 网卡实时流量监控
功能:显示指定网卡的实时入站/出站流量(引用自)。
代码片段:
bash
#!/bin/bash
nic=“eth0”
while true; do
in=$(cat /proc/net/dev | grep $nic | awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 2}̲') out=(cat /proc/net/dev | grep $nic | awk ‘{print $10}’)
echo “入站: $in KB/s | 出站: $out KB/s”
sleep 1
done
应用场景:网络带宽分析、异常流量检测。
- SSH 密钥批量部署
功能:为多台服务器生成 SSH 密钥并分发公钥(引用自)。
代码片段:
bash
#!/bin/bash
for ip in
(
c
a
t
h
o
s
t
s
.
t
x
t
)
;
d
o
s
s
h
−
k
e
y
g
e
n
−
t
r
s
a
−
f
/
.
s
s
h
/
(cat hosts.txt); do ssh-keygen -t rsa -f ~/.ssh/
(cathosts.txt);dossh−keygen−trsa−f /.ssh/{ip}_key -N “”
ssh-copy-id -i ~/.ssh/${ip}_key.pub $ip
done
优化建议:
添加并行执行(使用 & 和 wait)。
四、数据库与中间件类
7. MySQL 自动备份与 OSS 同步
功能:定时备份数据库,压缩后上传至阿里云 OSS(引用自)。
代码片段:
bash
#!/bin/bash
mysqldump -u root -p密码 数据库名 > backup.sql
tar -czf backup.tar.gz backup.sql
ossutil cp backup.tar.gz oss://bucket-name/
安全建议:
使用环境变量存储密码(避免明文)。
添加备份校验(如 md5sum)。
五、监控与告警类
8. CPU/内存/磁盘综合监控
功能:实时监控系统资源,超阈值触发告警(引用自)。
代码片段:
bash
#!/bin/bash
cpu=$(mpstat 1 1 | awk '/Average/{print 100 - KaTeX parse error: Expected 'EOF', got '}' at position 3: NF}̲') mem=(free | awk '/Mem/{printf “%.2f%”, $3/KaTeX parse error: Expected 'EOF', got '}' at position 8: 2 * 100}̲') disk=(df -h / | awk ‘///{print $5}’ | sed ‘s/%//’)
if [ $cpu -gt 80 ] || [ $mem -gt 80 ] || [
d
i
s
k
−
g
t
90
]
;
t
h
e
n
e
c
h
o
"
资源告警!
C
P
U
:
disk -gt 90 ]; then echo "资源告警!CPU:
disk−gt90];thenecho"资源告警!CPU:cpu% 内存:
m
e
m
内存磁盘
:
mem 内存 磁盘:
mem内存磁盘:disk%" | mail -s “系统资源告警” admin
fi
六、自动化部署类
9. Docker 容器一键部署
功能:自动拉取镜像、启动容器并配置网络(引用自)。
代码片段:
bash
#!/bin/bash
docker pull nginx:latest
docker run -d --name web -p 80:80 nginx
echo “Nginx 容器已启动,访问 http://localhost”
10. Kubernetes 集群初始化
功能:自动化安装 kubeadm、kubelet 并初始化集群(引用自)。
代码片段:
bash
#!/bin/bash
apt-get install -y kubelet kubeadm kubectl
kubeadm init --pod-network-cidr=10.244.0.0/16
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml