
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
函数 + 日志
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"
}
参数解析
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}"
常用模式
# 并行:一次处理 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 输出进行编码