正在加载,请稍候…

Bash 脚本:自动化、错误处理与最佳实践

编写可靠的 Bash 脚本——掌握 set -euo pipefail、trap、参数解析、函数、数组及常见自动化模式

Bash 脚本:自动化、错误处理与最佳实践

Bash 脚本模板

#!/usr/bin/env bash
set -euo pipefail  # 遇到错误、未定义变量、管道失败时退出

PORT="${PORT:-3000}"
DB_URL="${DATABASE_URL:?DATABASE_URL is required}"

TMP=""
cleanup() { [[ -n "$TMP" ]] && rm -f "$TMP"; }
trap cleanup EXIT
trap 'echo "Error at line $LINENO" >&2; exit 1' ERR

Bash 脚本:自动化、错误处理与最佳实践 插图

函数 + 日志

log() {
  local level="$1"; shift
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $*" >&2
}

process_file() {
  local file="$1"
  [[ ! -f "$file" ]] && { log "ERROR" "Not found: $file"; return 1; }
  TMP=$(mktemp)
  grep -v "^#" "$file" > "$TMP"
  mv "$TMP" "$file"
  log "INFO" "Processed: $file"
}

Bash 脚本:自动化、错误处理与最佳实践 插图

参数解析

usage() { echo "Usage: $0 [-v] [-o DIR] file"; exit 1; }
VERBOSE=false; OUTPUT="./output"
while getopts "vo:h" opt; do
  case $opt in
    v) VERBOSE=true ;; o) OUTPUT="$OPTARG" ;; h|*) usage ;;
  esac
done
shift $((OPTIND-1))
INPUT="${1:?Input file required}"

Bash 脚本:自动化、错误处理与最佳实践 插图

常用模式

# 并行:一次处理 4 个文件
find . -name "*.log" | xargs -P 4 -I {} gzip {}

# 检查依赖
command -v docker &>/dev/null || { echo "Docker required"; exit 1; }

# 字符串操作
ext="${file##*.}"    # 获取扩展名
base="${file%.*}"    # 移除扩展名

# Here-doc 配置
cat > /etc/app/config.yml <<EOF
port: ${PORT}
db: ${DB_URL}
EOF

-> 使用 Base64 转换器 对 Bash 输出进行编码