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
}