Shell脚本指南

脚本模板

#!/usr/bin/env bash set -euo pipefail # 遇错退出、禁用未定义变量、管道失败退出 IFS=$'\n\t' # 脚本目录 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" main() { local name="${1:-World}" echo "Hello, $name!" } main "$@"

变量与字符串

name="Alice" greeting="Hello, $name" # 默认值 port="${PORT:-8080}" # 字符串操作 file="photo.tar.gz" echo "${file%.gz}" # photo.tar (删除后缀) echo "${file%%.*}" # photo (删除所有.及之后) echo "${file#photo.}" # tar.gz (删除前缀) echo "${#file}" # 11 (长度) echo "${file/photo/img}" # img.tar.gz (替换)

数组

arr=(one two three four) echo "${arr[0]}" # one echo "${arr[@]}" # 所有元素 echo "${#arr[@]}" # 4 (长度) arr+=("five") # 追加 # 遍历 for item in "${arr[@]}"; do echo "$item" done # 关联数组(Bash 4+) declare -A map map["key"]="value" echo "${map[key]}"

函数

log() { local level="$1"; shift echo "[$(date '+%Y-%m-%d %H:%M:%S')] [$level] $*" >&2 } retry() { local attempts="${1:-3}"; shift local cmd=("$@") for ((i=1; i<=attempts; i++)); do "${cmd[@]}" && return 0 log WARN "Attempt $i/$attempts failed" sleep $((i * 2)) done return 1 }