深入实践 Shell 脚本编程:高效自动化操作指南


一、什么是 Shell 脚本?

Shell 脚本是一种用 Shell 编写的脚本程序,用于执行一系列的命令。它是 Linux/Unix 系统中自动化管理任务的利器,能够显著提升工作效率,特别适合批量处理文件、监控系统状态、自动部署等任务。


二、Shell 脚本的基础语法

1. 脚本结构
  • Shebang 行 :指定解释器路径。

    bash 复制代码
    #!/bin/bash
  • 注释 :以 # 开头的内容表示注释。

    bash 复制代码
    # 这是一个注释
2. 变量
  • 定义变量

    bash 复制代码
    NAME="Linux"
  • 使用变量

    bash 复制代码
    echo "Welcome to $NAME"
  • 读取用户输入

    bash 复制代码
    read USERNAME
    echo "Hello, $USERNAME"
3. 条件语句
  • if 结构

    bash 复制代码
    if [ condition ]; then
        echo "Condition met"
    else
        echo "Condition not met"
    fi
  • 条件操作符

    • 文件判断:-e(存在)、-d(目录)、-f(文件)。
    • 数值比较:-eq(等于)、-gt(大于)、-lt(小于)。
    • 字符串比较:=(等于)、!=(不等)。
4. 循环
  • for 循环

    bash 复制代码
    for i in {1..5}; do
        echo "Iteration $i"
    done
  • while 循环

    bash 复制代码
    counter=1
    while [ $counter -le 5 ]; do
        echo "Count: $counter"
        ((counter++))
    done
5. 函数
  • 定义函数

    bash 复制代码
    my_function() {
        echo "This is a function"
    }
  • 调用函数

    bash 复制代码
    my_function

三、Shell 脚本实战案例

1. 文件批量处理

需求 :批量将 .log 文件重命名为带时间戳的文件名。

代码示例

bash 复制代码
#!/bin/bash

for file in *.log; do
    timestamp=$(date +%Y%m%d_%H%M%S)
    mv "$file" "${file%.log}_$timestamp.log"
    echo "Renamed $file to ${file%.log}_$timestamp.log"
done

执行方法

  1. 保存为 rename_logs.sh

  2. 运行脚本:

    bash 复制代码
    chmod +x rename_logs.sh
    ./rename_logs.sh

2. 系统监控脚本

需求:定时监控系统的 CPU 和内存使用情况。

代码示例

bash 复制代码
#!/bin/bash

while true; do
    echo "CPU Usage: $(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')%"
    echo "Memory Usage: $(free -m | awk '/Mem:/ {printf "%.2f%%\n", $3/$2 * 100}')"
    sleep 5
done

执行方法

bash 复制代码
chmod +x monitor.sh
./monitor.sh

3. 自动备份脚本

需求 :自动将指定目录下的文件压缩备份到 /backup 目录,并保留最近 7 天的备份。

代码示例

bash 复制代码
#!/bin/bash

SOURCE_DIR="/path/to/source"
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)

mkdir -p "$BACKUP_DIR"
tar -czf "$BACKUP_DIR/backup_$DATE.tar.gz" "$SOURCE_DIR"

# 删除 7 天前的备份
find "$BACKUP_DIR" -type f -mtime +7 -exec rm -f {} \;
echo "Backup completed and old backups cleaned."

执行方法

bash 复制代码
chmod +x backup.sh
./backup.sh

4. 自动检测网络状态

需求:检测一组 IP 地址是否可达,并记录到日志文件。

代码示例

bash 复制代码
#!/bin/bash

IP_LIST=("8.8.8.8" "1.1.1.1" "192.168.0.1")
LOG_FILE="network_status.log"

for ip in "${IP_LIST[@]}"; do
    if ping -c 1 $ip > /dev/null 2>&1; then
        echo "$(date): $ip is reachable" >> $LOG_FILE
    else
        echo "$(date): $ip is unreachable" >> $LOG_FILE
    fi
done

执行方法

bash 复制代码
chmod +x check_network.sh
./check_network.sh

5. 用户管理脚本

需求:批量创建用户并设置默认密码。

代码示例

bash 复制代码
#!/bin/bash

USER_LIST=("user1" "user2" "user3")
DEFAULT_PASSWORD="password123"

for user in "${USER_LIST[@]}"; do
    if id "$user" &>/dev/null; then
        echo "User $user already exists."
    else
        useradd "$user"
        echo "$DEFAULT_PASSWORD" | passwd --stdin "$user"
        echo "User $user created with default password."
    fi
done

执行方法

bash 复制代码
sudo chmod +x create_users.sh
sudo ./create_users.sh

四、Shell 脚本调试与优化

1. 调试脚本
  • 开启调试模式 :添加 set -x,逐行输出执行过程。

    bash 复制代码
    set -x
  • 检查错误 :使用 $? 检查上一条命令的执行结果。

2. 提高脚本效率
  • 使用 xargs 批量处理:

    bash 复制代码
    ls *.log | xargs rm
  • 避免使用子进程,尽量用内建命令。

3. 增强可读性
  • 增加注释,解释每段代码的功能。
  • 使用函数组织代码逻辑。

五、Shell 脚本进阶技巧

1. 使用数组
  • 定义数组:

    bash 复制代码
    my_array=("value1" "value2" "value3")
  • 遍历数组:

    bash 复制代码
    for item in "${my_array[@]}"; do
        echo $item
    done
2. 使用正则表达式
  • 匹配字符串:

    bash 复制代码
    if [[ $string =~ ^[0-9]+$ ]]; then
        echo "This is a number."
    fi
3. 捕获信号
  • 捕获 Ctrl+C 信号并执行清理操作:

    bash 复制代码
    trap "echo 'Interrupt signal received'; exit" SIGINT

六、Shell 脚本学习资源

1. 推荐书籍
  • 《Shell 编程技术》
  • 《Linux Shell 脚本攻略》
2. 在线资源
3. 实践平台
  • 使用本地虚拟机(如 VirtualBox)或云服务器(如 AWS、Google Cloud)。

七、总结

Shell 脚本是 Linux 系统管理的重要工具,其简单、高效、灵活的特性使其在自动化操作中不可或缺。通过掌握基础语法和实战案例,你可以在工作中实现各种自动化任务,提升工作效率。

下一步实践

  1. 将上述案例改进为适应你的实际需求。
  2. 学习结合 awksed 编写更复杂的脚本。
  3. 使用定时任务(crontab)将脚本应用到生产环境。
相关推荐
金创想22 分钟前
chrome主页被被篡改的修复方法
chrome·主页篡改
群联云防护小杜30 分钟前
如何给负载均衡平台做好安全防御
运维·服务器·网络·网络协议·安全·负载均衡
PyAIGCMaster1 小时前
ubuntu装P104驱动
linux·运维·ubuntu
奈何不吃鱼1 小时前
【Linux】ubuntu依赖安装的各种问题汇总
linux·运维·服务器
野蛮的大西瓜1 小时前
开源呼叫中心中,如何将ASR与IVR菜单结合,实现动态的IVR交互
人工智能·机器人·自动化·音视频·信息与通信
zzzhpzhpzzz1 小时前
Ubuntu如何查看硬件型号
linux·运维·ubuntu
蜜獾云1 小时前
linux firewalld 命令详解
linux·运维·服务器·网络·windows·网络安全·firewalld
陌北v11 小时前
Docker Compose 配置指南
运维·docker·容器·docker-compose
只会copy的搬运工2 小时前
Jenkins 持续集成部署——Jenkins实战与运维(1)
运维·ci/cd·jenkins
娶不到胡一菲的汪大东2 小时前
Ubuntu概述
linux·运维·ubuntu