#!/usr/bin/env bash set -euo pipefail PYTHON_BIN="/opt/homebrew/Caskroom/miniconda/base/bin/python" CONFIG_PATH="config/config.yaml" INPUT_FILE="" DRY_RUN="false" CONTINUE_ON_ERROR="true" usage() { cat <<'EOF' Usage: ./run.sh ./run.sh -f users.csv ./run.sh -f users.xlsx ./run.sh -f users.csv --dry-run ./run.sh -f users.xlsx --continue-on-error false ./run.sh -c config/config.yaml Options: -f Batch input file (.csv/.xlsx). If omitted, interactive mode is used. -c YAML config path (default: config/config.yaml) --dry-run Dry run mode --continue-on-error true|false Batch only, default true -h, --help Show this help EOF } while [[ $# -gt 0 ]]; do case "$1" in -f) INPUT_FILE="${2:-}" shift 2 ;; -c) CONFIG_PATH="${2:-}" shift 2 ;; --dry-run) DRY_RUN="true" shift ;; --continue-on-error) CONTINUE_ON_ERROR="${2:-}" if [[ "${CONTINUE_ON_ERROR}" != "true" && "${CONTINUE_ON_ERROR}" != "false" ]]; then echo "错误: --continue-on-error 仅支持 true 或 false" >&2 exit 2 fi shift 2 ;; -h|--help) usage exit 0 ;; *) echo "未知参数: $1" >&2 usage exit 2 ;; esac done if [[ -z "${INPUT_FILE}" ]]; then CMD=("${PYTHON_BIN}" -m ad_user_creator.main --config "${CONFIG_PATH}" interactive) if [[ "${DRY_RUN}" == "true" ]]; then CMD+=(--dry-run) fi exec "${CMD[@]}" fi if [[ ! -f "${INPUT_FILE}" ]]; then echo "错误: 输入文件不存在: ${INPUT_FILE}" >&2 exit 2 fi case "${INPUT_FILE##*.}" in csv|CSV|xlsx|XLSX) ;; *) echo "错误: 仅支持 .csv 或 .xlsx 文件: ${INPUT_FILE}" >&2 exit 2 ;; esac CMD=( "${PYTHON_BIN}" -m ad_user_creator.main --config "${CONFIG_PATH}" batch --input "${INPUT_FILE}" --continue-on-error "${CONTINUE_ON_ERROR}" ) if [[ "${DRY_RUN}" == "true" ]]; then CMD+=(--dry-run) fi exec "${CMD[@]}"