diff --git a/backup/backup.sh b/backup/backup.sh index 2ac5cb2..37f7a55 100644 --- a/backup/backup.sh +++ b/backup/backup.sh @@ -2,7 +2,9 @@ # backup.sh — 打包源目录并通过 SMB / (预留) SFTP 上传到远端 # 同时支持 Linux 与 macOS -set -u +set -o pipefail +# 注意:不开启 set -u —— macOS 自带 bash 3.2,对空位置参数 / 空数组("$@"、${arr[@]}) +# 会触发 unbound 报错并静默退出,导致脚本在加载完配置后就停下。 RED='\033[0;31m' GREEN='\033[0;32m' @@ -104,15 +106,15 @@ parse_args() { *) err "未知方式:$1"; usage; exit 1 ;; esac - # 第一遍只取 --config,使后续参数能覆盖配置 - local i=1 - local argv=("$@") - while [[ $i -le ${#argv[@]} ]]; do - local cur="${argv[$((i-1))]}" - if [[ "$cur" == "-C" || "$cur" == "--config" ]]; then - CONF_FILE="${argv[$i]}" + # 第一遍只取 --config / -C,使后续参数能覆盖配置 + # 使用 for 循环 + prev 变量,兼容 bash 3.2(避免数组索引在 set -u 下出问题) + local prev="" + local arg + for arg in "$@"; do + if [[ "$prev" == "-C" || "$prev" == "--config" ]]; then + CONF_FILE="$arg" fi - i=$((i+1)) + prev="$arg" done load_conf @@ -182,7 +184,7 @@ create_archive() { } cleanup_local() { - if [[ "$CLEAN_LOCAL" == "true" && -n "${ARCHIVE_FILE:-}" && -f "$ARCHIVE_FILE" ]]; then + if [[ "$CLEAN_LOCAL" == "true" && -n "$ARCHIVE_FILE" && -f "$ARCHIVE_FILE" ]]; then rm -f "$ARCHIVE_FILE" && log "已删除本地归档:$ARCHIVE_FILE" fi }