Shell 脚本基

一、Shell 脚本基础

  1. ​脚本结构
    ​Shebang 行:指定解释器,如 #!/bin/bash,确保跨环境兼容性。
    ​注释:以 # 开头,用于代码说明。
    ​执行权限:通过 chmod +x script.sh 赋予执行权限。
  2. ​变量
    ​定义规则:
    bash
    VAR_NAME=value # 等号两侧无空格
    readonly PI=3.14 # 只读变量
    export PATH=“$PATH:/usr/local/bin” # 全局变量
    ​变量类型:
    字符串:str=“Hello World”
    数值:num=10(默认为字符串,需用 $((…)) 或 expr 运算)。
    ​特殊变量:
    $0:脚本名称, 1 :第一个参数, 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 ]。
  2. ​循环结构
    ​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 "计数: countge5];doecho"计数:count"
    count=$((count+1))
    done

三、函数与模块化

  1. ​函数定义
    ​基本语法:
    bash
    function backup() {
    local src=$1
    local dest= 2 c p − r " 2 cp -r " 2cpr"src" “$dest”
    }
    backup /home/user/data /backup
    ​参数传递:通过 $1, 2 接收参数, 2 接收参数, 2接收参数,# 获取总数。
  2. ​返回值与作用域
    ​返回值:通过 return 或 echo 输出。
    ​局部变量:使用 local 声明,避免污染全局命名空间。

四、高级功能与技巧

  1. ​命令替换与管道
    ​命令替换:
    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 # 合并标准输出与错误
  2. ​进程管理
    ​后台运行:./script.sh &,jobs 查看后台任务。
    ​信号控制:kill -9 PID 强制终止,trap 捕捉信号。
  3. ​文本处理
    ​AWK:
    bash
    awk ‘/error/ {print $2}’ log.txt # 提取含 “error” 的第二列
    ​Sed:
    bash
    sed ‘s/old/new/g’ file.txt # 全局替换

五、错误处理与调试

  1. ​退出码与日志
    ​检查退出码:
    bash
    command
    if [ $? -ne 0 ]; then
    echo “命令执行失败”
    fi
    ​日志记录:
    bash
    exec > >(tee -a script.log) 2>&1 # 重定向所有输出到日志
  2. ​调试技巧
    ​启用调试模式:set -x 打印执行流程。
    ​严格模式:set -euo pipefail 防止静默失败。

六、最佳实践与规范

  1. ​代码规范
    ​命名规范:变量小写下划线(如 user_name),函数动词开头(如 validate_input)。
    ​模块化:将常用功能拆分为独立脚本或函数库。
  2. ​安全性
    ​避免硬编码:敏感信息通过环境变量或加密文件传递。
    ​输入验证:使用正则表达式过滤非法字符。
  3. ​性能优化
    ​减少子进程:优先使用内置命令(如 echo 替代 printf)。
    ​流式处理:大文件时避免一次性加载到内存。

七、实战案例

  1. ​自动化备份脚本
    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
  2. ​日志监控脚本
    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 " LOGFILEwhilereadline;doifecho"line" | grep -q “ERROR”; then
    echo “ ( d a t e ) − 发现错误: (date) - 发现错误: (date)发现错误:line” | mail -s “紧急错误” dev-team@example.com
    fi
    done

七、实战案例

一、系统管理类

  1. ​服务器硬件信息采集脚本
    功能:一键获取 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 " (nvidiasmilwcl)echoe"{yellow}GPU 数量: g p u c o u n t gpu_count gpucount{nc}"
fi
应用场景:服务器巡检、硬件故障排查。

  1. ​自动化备份脚本
    功能:定时备份指定目录,压缩后存储并清理旧备份(引用自)。
    代码片段:

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+tarczf"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 " LOGPATHwhilereadline;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
应用场景:网络带宽分析、异常流量检测。

  1. ​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);dosshkeygentrsaf /.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: diskgt90];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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值