当前位置: 首页 > news >正文

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文件存在" fi
case语句

#!/bin/bash read -p "输入一个字符: " char case $char in [a-z]) echo "小写字母" ;; [A-Z]) echo "大写字母" ;; [0-9]) echo "数字" ;; *) echo "其他字符" ;; esac

1.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" done
while循环

#!/bin/bash count=1 while [ $count -le 5 ]; do echo "循环次数: $count" ((count++)) done # 读取文件行 while read line; do echo "行内容: $line" done < /etc/passwd
until循环

#!/bin/bash count=1 until [ $count -gt 5 ]; do echo "直到循环: $count" ((count++)) done

1.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.txt

2.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_services

3.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.sh
crontab管理命令

# 编辑当前用户的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>&1

4.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命令的灵活使用

可以大大提高系统管理的效率和可靠性。建议通过实际项目练习,逐步掌握这些技能,并遵循最佳实践编写健壮、安全的脚本。

http://www.cnnetsun.cn/news/1609929.html

相关文章:

  • 在WS2812项目中实现高效RGB与HSV色彩空间转换
  • LibreOffice版本兼容性避坑指南:从7.6降级到7.3解决SfxBaseModel报错
  • Anomalib图像异常检测:用Patchcore模型快速验证工业质检数据集
  • 从DICOM到3D渲染:用ITK-SNAP快速上手医学影像分析与标注(附实战案例)
  • 全知视角与隐私边界的冲突
  • 如何让 OpenClaw等AI Agent 从“能用”走向“可控、可引导、可落地”
  • 别再瞎选TEC了!手把手教你读懂半导体制冷片性能曲线(以127对为例)
  • 告别单调表盘:Mi-Create如何让小米穿戴设备焕发个性光彩?
  • 单季暴增 132%!抓住短剧出海这3个信号!
  • 戴森球计划蓝图库:终极工厂自动化解决方案
  • 异地就医报销,为啥有人多有人少?
  • 大学生如何加入网络安全社团?发展建议
  • imgclsmob部署终极指南:从本地开发到生产环境的完整流程
  • 拯救数字青春:GetQzonehistory让QQ空间记忆永久安家
  • 提升协作效率:KityMinder云同步功能全链路应用指南
  • Nunchaku FLUX.1 CustomV3问题解决:提示词怎么写?参数怎么调?一篇搞定
  • AI大模型产品经理成长之路:从零基础到专家的详细学习路线全解析【AI大模型产品经理学习路线】
  • ssm+java2026年毕设体育队训练的信息管理系统【源码+论文】
  • 剑指offer-57、二叉树的下一个节点
  • 鸿蒙 HarmonyOS 6 | Video 组件网络视频播放异常排查实战
  • wifi相关查询指令
  • Omni-Vision Sanctuary 模拟电路设计可视化:与 Multisim 仿真结果结合生成原理图效果图
  • GD32F4/H7上移植FreeRTOS+YT8512驱动,从LAN8700例程到实战的保姆级避坑记录
  • Android Studio中文界面终极配置指南:快速告别英文开发困境
  • 深入解析J1939协议中的PDU报文格式与PGN计算
  • 零基础入门AI开发:在快马平台创建你的第一个对话skills智能体
  • 基于Phi-3-mini-128k-instruct构建运维智能助手:Linux命令分析与故障排查
  • 睡眠监测项目踩坑记:STM32读取心率/体温传感器,数据上传OneNET时我遇到的3个典型问题
  • CosyVoice2效果展示:实测跨语种语音合成,中文音色说英文日文
  • 如何依据GB/T34944-2017开展Java代码漏洞测试(一)