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

本文提供了一套系统的 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%%
", $(NF-2)}')"
    echo "内存使用: $(free -m | awk '/Mem/{printf "%.2f%%
", $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 进阶方向

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

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

© 版权声明

相关文章

2 条评论

  • 头像
    蓉儿 读者

    无记录
    回复
  • 头像
    方芹菜菜 读者

    收藏了,感谢分享

    无记录
    回复