脚本编程: 从单行脚本到生产级
黄玮
2026-01
大多数脚本死于:变量未定义、命令失败继续执行、管道中途断裂。
黄金标准头:
#!/bin/bash
set -euo pipefail
-e: 遇到错误立即退出 (Exit on error)-u: 使用未定义变量报错 (Undefined variable)-o pipefail:
管道中任何一个命令失败,整个管道视为失败# 默认值
NAME="${1:-World}" # 如果 $1 为空,NAME="World"
# 字符串操作
FILE="image.png"
echo "${FILE%.*}" # 输出 image (去后缀)
echo "${FILE#*.}" # 输出 png (去前缀)
# 只读变量
readonly VERSION="1.0.0"
“无论执行多少次,结果状态一致,且不产生副作用。”
反例:
mkdir mydir # 第二次执行会报错 "File exists"
正例:
mkdir -p mydir # 无论执行多少次都成功
实战: 追加配置前先检查
if ! grep -q "my_alias" ~/.bashrc; then
echo "alias my_alias='ls -l'" >> ~/.bashrc
fi
log() {
echo "[$(date +%F_%T)] $1"
}
check_root() {
if [[ $EUID -ne 0 ]]; then
log "Error: Must be run as root" >&2
exit 1
fi
}
main() {
check_root
log "Starting update..."
apt update && apt upgrade -y
}
main "$@"