Linux Shell脚本自动化运维:从小白到高手的实战详解

2026年01月21日/ 浏览 8

本文提供了一套系统的 Linux Shell 脚本编程教程,从基础概念到高级实战,涵盖环境变量、流程控制、函数应用和实际案例,帮助读者快速掌握自动化运维的核心技能。

一、Shell 基础入门

1.1 Shell 是什么?

Shell 是一个命令行解释器,它接收用户输入的命令并将其转换为系统操作。通过编写 Shell 脚本,我们可以将多个命令组合在一起,实现自动化任务,提高工作效率。常见的 Shell 包括 Bash、Zsh、Ksh 等,其中 Bash 是 Linux 系统默认的 Shell。

1.2 第一个 Shell 脚本:Hello World

创建一个简单的脚本文件并执行:

#!/bin/bash # 这是一个注释行 echo "Hello World"

保存为 hello.sh 后,需要添加执行权限:

chmod +x hello.sh ./hello.sh

输出结果:

Hello World

二、Shell 变量详解

2.1 变量定义与使用

Shell 变量无需声明类型,直接赋值即可:

name="Linux" version="7.0" echo "System: $name $version"

重要规则

变量名只能包含字母、数字和下划线不能以数字开头等号两边不能有空格

2.2 环境变量

系统预定义的环境变量:

echo "User: $USER" echo "Home: $HOME" echo "Path: $PATH" echo "Current: $PWD"

2.3 特殊变量

用于脚本参数处理:

echo "脚本名: $0" echo "第一个参数: $1" echo "参数个数: $#" echo "所有参数: $*" echo "上条命令结果: $?"

三、流程控制语句

3.1 条件判断(if语句)

基本语法结构:

if [ condition ]; then commands elif [ condition ]; then commands else commands fi

实际示例:检查文件是否存在

#!/bin/bash file="/etc/passwd" if [ -f "$file" ]; then echo "$file 存在" else echo "$file 不存在" fi

3.2 循环处理

for循环

遍历列表中的元素:

for i in 1 2 3 4 5 do echo "Number: $i" done

遍历文件内容:

for file in $(ls *.txt) do echo "Processing: $file" done

while循环

读取文件内容:

while read line do echo "Line: $line" done < /etc/passwd

计数器示例:

count=1 while [ $count -le 5 ] do echo "Count: $count" count=$((count+1)) done

3.3 case语句

多分支选择结构:

echo "选择操作:" echo "1) 重启服务" echo "2) 停止服务" echo "3) 查看状态" read choice case $choice in 1) systemctl restart sshd ;; 2) systemctl stop sshd ;; 3) systemctl status sshd ;; *) echo "无效选择" ;; esac

四、函数与数组

4.1 函数定义与调用

定义和调用函数:

# 定义函数 say_hello() { echo "Hello, $1!" } # 调用函数 say_hello "World"

带返回值的函数:

add() { result=$(( $1 + $2 )) return $result } add 5 3 echo "结果: $?"

4.2 数组操作

创建和访问数组:

# 定义数组 fruits=("apple" "banana" "cherry") # 访问元素 echo "第一个水果: ${fruits[0]}" # 遍历数组 for fruit in "${fruits[@]}" do echo "水果: $fruit" done # 数组长度 echo "数组长度: ${#fruits[@]}"

五、实战案例集锦

5.1 系统监控脚本

实时监控系统资源:

#!/bin/bash # 系统监控脚本 while true do clear echo "===== 系统监控 =====" echo "CPU使用率: $(top -bn1 | grep load | awk {printf "%.2f%%\n", $(NF-2)})" echo "内存使用: $(free -m | awk /Mem/{printf "%.2f%%\n", $3/$2 * 100})" echo "磁盘使用: $(df -h / | awk /\//{print $(NF-1)})" echo "运行时间: $(uptime | awk {print $3} | tr -d ,)" sleep 2 done

5.2 日志分析脚本

分析Apache访问日志:

#!/bin/bash # 日志分析脚本 log_file="/var/log/apache2/access.log" echo "===== Apache访问分析 =====" echo "总访问次数: $(wc -l < $log_file)" echo "独立IP数量: $(awk {print $1} $log_file | sort -u | wc -l)" echo "最频繁访问IP:" awk {print $1} $log_file | sort | uniq -c | sort -nr | head -5 echo "最热门页面:" awk {print $7} $log_file | sort | uniq -c | sort -nr | head -5

5.3 自动备份脚本

目录备份与压缩:

#!/bin/bash # 自动备份脚本 backup_dir="/home/user/backup" source_dir="/home/user/documents" date=$(date +%Y%m%d_%H%M%S) if [ ! -d "$backup_dir" ]; then mkdir -p "$backup_dir" fi tar -czf "$backup_dir/backup_$date.tar.gz" "$source_dir" if [ $? -eq 0 ]; then echo "备份成功: $backup_dir/backup_$date.tar.gz" else echo "备份失败!" fi # 删除7天前的备份 find "$backup_dir" -name "*.tar.gz" -mtime +7 -delete

5.4 服务监控脚本

监控关键服务状态:

#!/bin/bash # 服务监控脚本 services=("nginx" "mysql" "apache2") for service in "${services[@]}" do if systemctl is-active --quiet "$service"; then echo "$service: 运行中 ✓" else echo "$service: 未运行 ✗" systemctl start "$service" echo "已尝试启动 $service" fi done

六、高级技巧与最佳实践

6.1 错误处理

使用set命令进行错误控制:

# 遇到错误立即退出 set -e # 显示执行命令 set -x # 使用trap捕获信号 trap echo "脚本被中断"; exit 1 INT TERM

6.2 性能优化

优化脚本执行效率:

# 使用内置命令代替外部命令 # 慢: ls | grep pattern # 快: echo pattern* # 减少管道使用 # 慢: cat file | grep pattern # 快: grep pattern file # 使用awk进行复杂文本处理 awk /pattern/{print $1} file.txt

6.3 安全考虑

编写安全脚本的建议:

# 总是检查变量是否设置 : ${USERNAME:?"请设置USERNAME变量"} # 验证输入参数 if [ $# -lt 1 ]; then echo "用法: $0 filename" exit 1 fi # 使用引号防止空格问题 if [ -f "$filename" ]; then echo "文件存在" fi

七、学习资源与下一步

7.1 推荐资源

官方文档: GNU Bash手册在线教程: Linux Documentation Project书籍: 《Linux命令行与Shell脚本编程大全》

7.2 进阶方向

正则表达式:模式匹配与文本处理sed和awk:高级文本处理工具调试技巧:使用set -x和调试工具性能优化:脚本效率提升方法

通过掌握这些Shell脚本编程技能,您将能够自动化日常任务,提高工作效率,并为进一步学习系统管理和DevOps打下坚实基础。

picture loss