如何编写用于 Linux 任务自动化的 Bash 脚本

ShellShellBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本全面的bash脚本教程为开发者和系统管理员提供了一份实用指南,用于在Unix和Linux环境中创建强大的自动化脚本。从基本脚本结构到高级技术,学习者将获得简化系统任务、提高工作流程效率以及编写健壮的 shell 脚本所需的技能。

Bash 脚本基础

shell 脚本简介

Bash 脚本是在 Unix 和 Linux 环境中自动化任务的强大技术。作为 Linux 命令行和 Unix shell 编程的一项基本技能,bash 脚本使系统管理员和开发者能够创建高效、可重复的工作流程。

Bash 脚本的核心概念

脚本结构与执行

一个典型的 bash 脚本以 shebang 行开头,并包含一系列命令:

#!/bin/bash
## 第一个 bash 脚本示例

echo "Hello, Linux World!"

Bash 脚本的关键组件

组件 描述 示例
Shebang 指定解释器 #!/bin/bash
变量 存储数据 name="John"
条件语句 控制流程 if [ condition ]; then
函数 可重用的代码块 function greet() { }

基本脚本执行工作流程

graph TD A[编写脚本] --> B[保存.sh 文件] B --> C[设置可执行权限] C --> D[运行脚本]

实用脚本示例

变量声明与使用

#!/bin/bash
username="DevOps 工程师"
echo "欢迎,$username!"

current_date=$(date)
echo "当前日期:$current_date"

简单条件逻辑

#!/bin/bash
age=25

if [ $age -ge 18 ]; then
  echo "你是成年人"
else
  echo "你是未成年人"
fi

脚本权限与执行

要运行 bash 脚本,需设置可执行权限:

chmod +x script.sh
./script.sh

高级脚本技术

错误处理与调试

陷阱与信号管理

#!/bin/bash
trap 'echo "Error occurred!"; exit 1' ERR

function critical_operation() {
  [[ $? -ne 0 ]] && exit 1
}

复杂控制结构

高级循环与条件语句

#!/bin/bash
declare -A servers=(
  [web]="nginx"
  [db]="postgresql"
  [cache]="redis"
)

for service in "${!servers[@]}"; do
  status=$(systemctl is-active "${servers[$service]}")
  case $status in
    active)
      echo "$service is running"
      ;;
    inactive)
      echo "$service is stopped"
      ;;
  esac
done

脚本优化技术

技术 描述 性能影响
命令替换 使用 $() 比反引号更快
局部变量 作用域限制 减少内存使用
参数扩展 动态变量操作 高效的字符串处理

并行处理

graph LR A[主脚本] --> B[派生进程 1] A --> C[派生进程 2] A --> D[派生进程 3]

并发脚本执行

#!/bin/bash
process_data() {
  local input=$1
  ## 复杂的数据处理
}

for file in /data/*.log; do
  process_data "$file" &
done
wait

动态脚本生成

#!/bin/bash
generate_config() {
  local service=$1
  local port=$2
  cat << EOF > "/etc/services/${service}.conf"
service_name=$service
listen_port=$port
EOF
}

generate_config "webserver" 8080

高级参数处理

#!/bin/bash
while getopts ":h:p:" opt; do
  case $opt in
    h)
      host="$OPTARG"
      ;;
    p)
      port="$OPTARG"
      ;;
    \?)
      echo "Invalid option"
      ;;
  esac
done

实际脚本项目

系统健康监测脚本

#!/bin/bash
LOG_DIR="/var/log/system_health"
mkdir -p $LOG_DIR

monitor_system() {
  ## CPU 使用情况
  echo "CPU 使用情况: $(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4"%"}')" >> $LOG_DIR/system_health.log

  ## 内存使用情况
  free -h | grep Mem: >> $LOG_DIR/system_health.log

  ## 磁盘空间
  df -h / >> $LOG_DIR/system_health.log
}

alert_critical_conditions() {
  local cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
  if (($(echo "$cpu_usage > 80" | bc -l))); then
    mail -s "高 CPU 警报" [email protected] < $LOG_DIR/system_health.log
  fi
}

monitor_system
alert_critical_conditions

自动化备份解决方案

#!/bin/bash
BACKUP_DIRS=("/home" "/etc" "/var/www")
BACKUP_DESTINATION="/mnt/backup"
DATE=$(date +"%Y%m%d")

create_backup() {
  for dir in "${BACKUP_DIRS[@]}"; do
    tar -czf "$BACKUP_DESTINATION/backup_${dir//\//_}_$DATE.tar.gz" "$dir"
  done
}

rotate_backups() {
  find "$BACKUP_DESTINATION" -type f -mtime +30 -delete
}

create_backup
rotate_backups

部署自动化工作流程

graph TD A[开始部署] --> B[拉取最新代码] B --> C[运行测试] C --> D{测试通过?} D -->|是| E[部署到预发布环境] D -->|否| F[停止部署] E --> G[部署到生产环境]

网络连接检查器

#!/bin/bash
CRITICAL_SERVICES=(
  "google.com:80"
  "github.com:443"
  "company-internal-service:8080"
)

check_network() {
  for service in "${CRITICAL_SERVICES[@]}"; do
    host=$(echo "$service" | cut -d: -f1)
    port=$(echo "$service" | cut -d: -f2)

    timeout 5 bash -c "</dev/tcp/$host/$port" 2> /dev/null

    if [ $? -eq 0 ]; then
      echo "$host:$port 在线"
    else
      echo "$host:$port 离线"
      ## 可选:发送警报
    fi
  done
}

check_network

服务管理脚本

功能 描述 命令
启动服务 启动关键服务 systemctl start
检查状态 验证服务健康状况 systemctl status
重启服务 从故障中恢复 systemctl restart

日志轮转与管理

#!/bin/bash
LOG_PATHS=(
  "/var/log/nginx/access.log"
  "/var/log/mysql/slow-query.log"
)

rotate_logs() {
  for log in "${LOG_PATHS[@]}"; do
    if [ -f "$log" ]; then
      mv "$log" "$log.$(date +%Y%m%d)"
      touch "$log"
      chmod 640 "$log"
    fi
  done
}

compress_old_logs() {
  find /var/log -type f -name "*.log.*" -mtime +7 -exec gzip {} \;
}

rotate_logs
compress_old_logs

总结

Bash 脚本编程是现代系统管理员和开发者的一项关键技能,它能在 Unix 和 Linux 平台上实现强大的自动化功能以及高效的任务管理。通过掌握脚本结构、变量、条件语句和错误处理技术,专业人员能够创建复杂的脚本,从而简化复杂的系统操作并提高技术环境中的工作效率。