Shell脚本编程与自动化运维了解006
一、Shell脚本基础
1.1 Bash脚本概述
Shell脚本是一种解释型编程语言,用于自动化Linux系统管理任务。Bash(Bourne Again SHell)是Linux系统中最常用的Shell解释器。
脚本基本结构
图
#!/bin/bash # 这是一个注释 echo "Hello, World!"关键要素:
●#!/bin/bash- Shebang,指定脚本解释器
●#- 注释符号
●echo- 输出命令
1.2 变量操作
变量定义与使用
图
#!/bin/bash # 变量定义(等号两边不能有空格) name="John" age=25 is_student=true # 变量引用 echo "Name: $name" echo "Age: ${age}" # 推荐使用${}格式 # 只读变量 readonly PI=3.14159 # 删除变量 unset name特殊变量
图
#!/bin/bash echo "脚本名称: $0" echo "第一个参数: $1" echo "第二个参数: $2" echo "参数个数: $#" echo "所有参数: $*" echo "进程ID: $$" echo "上一个命令状态: $?"1.3 条件判断
if-else语句
图
#!/bin/bash # 数值比较 num=10 if [ $num -gt 5 ]; then echo "数字大于5" elif [ $num -eq 5 ]; then echo "数字等于5" else echo "数字小于5" fi # 字符串比较 str="hello" if [ "$str" = "hello" ]; then echo "字符串匹配" fi # 文件测试 if [ -f "/etc/passwd" ]; then echo "/etc/passwd文件存在" ficase语句
图
#!/bin/bash read -p "输入一个字符: " char case $char in [a-z]) echo "小写字母" ;; [A-Z]) echo "大写字母" ;; [0-9]) echo "数字" ;; *) echo "其他字符" ;; esac1.4 循环结构
for循环
图
#!/bin/bash # 列表循环 for i in 1 2 3 4 5; do echo "数字: $i" done # C风格循环 for ((i=1; i<=5; i++)); do echo "计数: $i" done # 遍历文件 for file in *.txt; do echo "文本文件: $file" donewhile循环
图
#!/bin/bash count=1 while [ $count -le 5 ]; do echo "循环次数: $count" ((count++)) done # 读取文件行 while read line; do echo "行内容: $line" done < /etc/passwduntil循环
图
#!/bin/bash count=1 until [ $count -gt 5 ]; do echo "直到循环: $count" ((count++)) done1.5 函数定义
基本函数
图
#!/bin/bash # 函数定义 greet() { local name=$1 # local定义局部变量 echo "Hello, $name!" } # 函数调用 greet "Alice" greet "Bob" # 带返回值的函数 add() { local a=$1 local b=$2 return $((a + b)) } add 5 3 result=$? echo "结果: $result"函数参数处理
图
#!/bin/bash process_args() { echo "函数名称: $FUNCNAME" echo "参数个数: $#" echo "所有参数: $*" for arg in "$@"; do echo "参数: $arg" done } process_args arg1 arg2 arg3二、文本处理工具
2.1 grep命令
基本用法
图
# 搜索包含特定字符串的行 grep "error" /var/log/syslog # 忽略大小写 grep -i "error" /var/log/syslog # 显示行号 grep -n "error" /var/log/syslog # 反向搜索(不包含) grep -v "success" /var/log/syslog # 使用正则表达式 grep -E "error|warning" /var/log/syslog高级用法
图
# 递归搜索目录 grep -r "function" /path/to/directory # 只显示匹配的文件名 grep -l "TODO" *.py # 统计匹配行数 grep -c "error" /var/log/syslog # 显示匹配行的上下文 grep -C 2 "error" /var/log/syslog # 显示匹配行前后2行2.2 sed命令
基本替换
图
# 替换文本 sed 's/old/new/g' file.txt # 只替换第一次出现 sed 's/old/new/' file.txt # 替换特定行 sed '3s/old/new/' file.txt # 只替换第3行 # 删除行 sed 'd' file.txt # 删除所有行 sed '/pattern/d' file.txt # 删除包含pattern的行高级编辑
图
# 插入文本 sed '2i\新行内容' file.txt # 在第2行前插入 # 追加文本 sed '2a\新行内容' file.txt # 在第2行后追加 # 修改行 sed '2c\替换内容' file.txt # 替换第2行 # 多命令执行 sed -e 's/old1/new1/g' -e 's/old2/new2/g' file.txt # 从文件读取命令 sed -f script.sed file.txt2.3 awk命令
基本用法
图
# 打印特定字段 awk '{print $1}' file.txt # 打印第一列 # 指定分隔符 awk -F':' '{print $1}' /etc/passwd # 以:为分隔符 # 条件处理 awk '$3 > 50 {print $1, $3}' data.txt # BEGIN和END块 awk 'BEGIN {sum=0} {sum+=$1} END {print "总和:", sum}' numbers.txt高级功能
图
# 内置变量 awk '{print NR, NF, $0}' file.txt # NR: 行号, NF: 字段数, $0: 整行内容 # 数组处理 awk '{count[$1]++} END {for (word in count) print word, count[word]}' file.txt # 格式化输出 awk '{printf "%-10s %5d\n", $1, $2}' data.txt三、自动化任务
3.1 系统监控脚本
CPU和内存监控
图
#!/bin/bash # CPU使用率监控 monitor_cpu() { local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1) echo "CPU使用率: ${cpu_usage}%" if (( $(echo "$cpu_usage > 80" | bc -l) )); then echo "警告: CPU使用率过高!" fi } # 内存使用监控 monitor_memory() { local mem_total=$(free | grep Mem | awk '{print $2}') local mem_used=$(free | grep Mem | awk '{print $3}') local mem_percent=$((mem_used * 100 / mem_total)) echo "内存使用率: ${mem_percent}%" if [ $mem_percent -gt 80 ]; then echo "警告: 内存使用率过高!" fi } # 磁盘空间监控 monitor_disk() { df -h | awk 'NR>1 {print $1 ": " $5 " 使用"}' } # 主监控循环 while true; do echo "=== 系统监控报告 $(date) ===" monitor_cpu monitor_memory monitor_disk echo "========================" sleep 60 # 每分钟执行一次 done进程监控
图
#!/bin/bash # 监控关键服务 monitor_services() { local services=("nginx" "mysql" "redis") for service in "${services[@]}"; do if pgrep $service > /dev/null; then echo "$service: 运行中" else echo "$service: 未运行!" # 可以添加自动重启逻辑 # systemctl start $service fi done } monitor_services3.2 日志分析脚本
图
#!/bin/bash # 分析Web服务器日志 analyze_nginx_log() { local log_file="/var/log/nginx/access.log" if [ ! -f "$log_file" ]; then echo "日志文件不存在: $log_file" return 1 fi echo "=== Nginx日志分析报告 ===" echo "总请求数: $(wc -l < $log_file)" echo "独立IP数: $(awk '{print $1}' $log_file | sort | uniq | wc -l)" echo "最频繁访问的页面:" awk '{print $7}' $log_file | sort | uniq -c | sort -nr | head -5 echo "错误请求:" awk '$9 ~ /[45][0-9][0-9]/ {print $9, $7}' $log_file | sort | uniq -c | sort -nr } analyze_nginx_log四、计划任务管理
4.1 cron定时任务
crontab语法
图
* * * * * command │ │ │ │ │ │ │ │ │ └── 星期几 (0-7, 0和7都表示周日) │ │ │ └──── 月份 (1-12) │ │ └────── 日期 (1-31) │ └──────── 小时 (0-23) └────────── 分钟 (0-59)常用时间表达式
图
# 每分钟执行 * * * * * /path/to/script.sh # 每小时执行 0 * * * * /path/to/script.sh # 每天凌晨2点执行 0 2 * * * /path/to/script.sh # 每周一早上9点执行 0 9 * * 1 /path/to/script.sh # 每月1号中午12点执行 0 12 1 * * /path/to/script.shcrontab管理命令
图
# 编辑当前用户的crontab crontab -e # 查看当前用户的crontab crontab -l # 删除当前用户的crontab crontab -r # 编辑指定用户的crontab crontab -u username -e环境配置
图
# 在crontab中设置环境变量 SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin MAILTO=admin@example.com # 示例任务 0 2 * * * /backup/script.sh >> /var/log/backup.log 2>&14.2 at一次性任务
基本用法
图
# 在指定时间执行命令 echo "echo '任务完成'" | at now + 5 minutes echo "systemctl restart nginx" | at 2:00 AM tomorrow # 查看待执行任务 atq # 删除任务 atrm job_number时间格式
图
# 相对时间 at now + 10 minutes at now + 2 hours at now + 3 days # 绝对时间 at 14:30 at midnight at teatime # 下午4点4.3 系统级计划任务
/etc/crontab文件
图
# /etc/crontab格式包含用户字段 # m h dom mon dow user command 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly/etc/cron.d目录
● 存放系统服务的cron配置文件
● 格式与/etc/crontab相同
● 便于软件包管理
五、最佳实践与技巧
5.1 脚本编写规范
脚本头部
图
#!/bin/bash # # 脚本名称: backup.sh # 描述: 系统备份脚本 # 作者: Your Name # 版本: 1.0 # 创建时间: $(date +%Y-%m-%d) # # 设置严格模式 set -euo pipefail错误处理
图
#!/bin/bash # 错误处理函数 error_exit() { echo "错误: $1" >&2 exit 1 } # 捕获错误 trap 'error_exit "命令失败: $BASH_COMMAND"' ERR # 检查命令是否存在 check_command() { if ! command -v $1 &> /dev/null; then error_exit "$1 命令未找到" fi }5.2 调试技巧
调试模式
图
#!/bin/bash # 启用调试 set -x # 或者在运行时启用 # bash -x script.sh # 关闭调试 set +x日志记录
图
#!/bin/bash # 日志函数 log() { local level=$1 local message=$2 echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $message" | tee -a /var/log/myscript.log } # 使用示例 log "INFO" "脚本开始执行" log "ERROR" "发生错误"5.3 安全考虑
权限控制
图
#!/bin/bash # 检查是否以root运行 if [ "$(id -u)" -ne 0 ]; then echo "请以root权限运行此脚本" exit 1 fi # 设置脚本权限 chmod 700 script.sh输入验证
图
#!/bin/bash # 验证参数 validate_input() { if ; then echo "输入包含非法字符" return 1 fi }六、总结
Shell脚本编程和自动化运维是Linux系统管理员的核心技能。通过掌握:
1.Bash脚本基础:变量、条件、循环、函数等编程结构
2.文本处理工具:grep、sed、awk等强大的文本处理能力
3.自动化任务:系统监控、日志分析等实际应用
4.计划任务管理:cron和at命令的灵活使用
可以大大提高系统管理的效率和可靠性。建议通过实际项目练习,逐步掌握这些技能,并遵循最佳实践编写健壮、安全的脚本。
