mac-软件安装脚本

shell脚本
#!/bin/bash
# =============================================================
#  macOS 开发环境一键安装脚本
#  依据旧 Mac 的 ~/.zshrc 配置整理(2026-09 更新)
#
#  用法:
#    chmod +x mac_setup.sh
#    ./mac_setup.sh
#
#  说明:
#   - 自动识别 Apple Silicon / Intel,并安装 Homebrew
#   - 需要先装好 Xcode Command Line Tools(脚本会检查并提示)
#   - JDK pkg、Docker Desktop 安装时可能要求输入管理员密码
#   - 百度内部工具、鸿蒙 HDC 需内网/官方安装器,脚本只做提示
#   - 所有路径均使用 $HOME,不依赖旧机器的用户名
# =============================================================

set -uo pipefail

# ---------- 输出辅助 ----------
INFO()   { printf "\033[36m[INFO]\033[0m %s\n" "$*"; }
OK()     { printf "\033[32m[ OK ]\033[0m %s\n" "$*"; }
WARN()   { printf "\033[33m[WARN]\033[0m %s\n" "$*"; }
ERR()    { printf "\033[31m[FAIL]\033[0m %s\n" "$*"; }
SECTION(){ printf "\n\033[1;34m========== %s ==========\033[0m\n" "$*"; }

# ---------- 选项(按需修改) ----------
INSTALL_DOCKER_DESKTOP=1  # 1=安装 Docker Desktop(GUI),0=跳过
INSTALL_MYSQL_80=0        # 1=同时安装旧版 mysql@8.0(旧配置里引用过),0=只装 8.4
INSTALL_PY39=0            # 1=安装 python@3.9(已弃用,2026-10-15 后无法安装),0=跳过
START_SERVICES=0          # 1=安装后自动启动 nginx/redis/mysql 服务,0=不启动
GO_VERSION=""             # 由脚本自动探测最新稳定版,无需修改

# 若 Homebrew 下载慢(国内网络),可在执行本脚本前 export 以下镜像变量:
#   export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api"
#   export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"
#   export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
#   export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"

# =============================================================
#  1. 系统检查
# =============================================================
SECTION "系统检查"
if [[ "$(uname -s)" != "Darwin" ]]; then
  ERR "本脚本仅用于 macOS,当前系统:$(uname -s)"
  exit 1
fi

if [[ "$(uname -m)" == "arm64" ]]; then
  BREW_PREFIX="/opt/homebrew"
  INFO "检测到 Apple Silicon (ARM64),Homebrew 前缀:$BREW_PREFIX"
else
  BREW_PREFIX="/usr/local"
  INFO "检测到 Intel Mac,Homebrew 前缀:$BREW_PREFIX"
fi

if ! xcode-select -p >/dev/null 2>&1; then
  WARN "未检测到 Xcode Command Line Tools,正在弹出安装窗口..."
  WARN "请在弹出的窗口中点击安装,完成后【重新运行本脚本】"
  xcode-select --install
  exit 1
fi
OK "Xcode Command Line Tools 已就绪"

# =============================================================
#  2. Homebrew
# =============================================================
SECTION "安装 Homebrew"
if ! command -v brew >/dev/null 2>&1; then
  INFO "正在安装 Homebrew(官方脚本,可能需要几分钟)..."
  NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
eval "$("$BREW_PREFIX/bin/brew" shellenv)" 2>/dev/null || export PATH="$BREW_PREFIX/bin:$PATH"
if ! brew --version >/dev/null 2>&1; then
  ERR "Homebrew 安装失败,请检查网络后重试"
  exit 1
fi
brew update >/dev/null 2>&1 || WARN "brew update 失败(可忽略,继续安装)"
OK "Homebrew 版本:$(brew --version | head -1)"

# =============================================================
#  3. 基础命令行工具(来自 .zshrc:coreutils / gnu-sed)
# =============================================================
SECTION "基础命令行工具"
for pkg in git coreutils gnu-sed; do
  if brew list --versions "$pkg" >/dev/null 2>&1; then
    OK "$pkg 已安装"
  else
    INFO "安装 $pkg ..."
    brew install "$pkg" && OK "$pkg 安装完成" || WARN "$pkg 安装失败"
  fi
done
# 说明:coreutils、gnu-sed 是 keg-only,需在 .zshrc 中保留旧配置的 PATH 行

# =============================================================
#  4. Shell 环境:oh-my-zsh + 插件 + 终端美化
# =============================================================
SECTION "Shell 环境:oh-my-zsh / starship / lsd / fastfetch"

if [[ ! -d "$HOME/.oh-my-zsh" ]]; then
  INFO "安装 oh-my-zsh ..."
  RUNZSH=no CHSH=no sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" \
    && OK "oh-my-zsh 已安装" || WARN "oh-my-zsh 安装失败"
else
  OK "oh-my-zsh 已安装"
fi

ZSH_CUSTOM="${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}"
for plugin in zsh-autosuggestions zsh-syntax-highlighting; do
  if [[ -d "$ZSH_CUSTOM/plugins/$plugin" ]]; then
    OK "插件 $plugin 已存在"
  else
    INFO "安装插件 $plugin ..."
    git clone --depth 1 "https://github.com/zsh-users/$plugin.git" "$ZSH_CUSTOM/plugins/$plugin" >/dev/null 2>&1 \
      && OK "$plugin 已安装" || WARN "$plugin 安装失败"
  fi
done

for pkg in starship lsd fastfetch; do
  if brew list --versions "$pkg" >/dev/null 2>&1; then
    OK "$pkg 已安装"
  else
    INFO "安装 $pkg ..."
    brew install "$pkg" && OK "$pkg 安装完成" || WARN "$pkg 安装失败"
  fi
done
# 提示:.zshrc 中对应启用方式为:
#   plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
#   eval "$(starship init zsh)" ; alias la='lsd -a' ; alias lla='lsd -la'
#   [[ -o interactive ]] && fastfetch

# =============================================================
#  5. 语言运行时:Go / Node / Python / Java / PHP
# =============================================================
SECTION "语言运行时:Go / Node / Python / Java / PHP"

# --- Go(goenv) ---
if [[ ! -d "$HOME/.goenv" ]]; then
  INFO "安装 goenv ..."
  git clone --depth 1 https://github.com/syndbg/goenv.git "$HOME/.goenv" >/dev/null 2>&1 \
    && OK "goenv 已安装" || WARN "goenv 安装失败"
fi
if command -v goenv >/dev/null 2>&1 || [[ -x "$HOME/.goenv/bin/goenv" ]]; then
  export GOENV_ROOT="$HOME/.goenv"
  export PATH="$GOENV_ROOT/bin:$PATH"
  eval "$(goenv init -)" >/dev/null 2>&1 || true
  GO_VERSION="$(goenv install -l 2>/dev/null | sed 's/^ *//; s/ *$//' | grep -E '^[0-9]+\.[0-9]+(\.[0-9]+)?$' | tail -1)"
  if [[ -n "$GO_VERSION" ]]; then
    if goenv versions 2>/dev/null | grep -q "$GO_VERSION"; then
      OK "Go $GO_VERSION 已就绪"
    else
      INFO "安装 Go $GO_VERSION(编译需几分钟,请耐心等待)..."
      goenv install "$GO_VERSION" && { goenv global "$GO_VERSION"; OK "Go $GO_VERSION 已设为默认"; } \
        || WARN "Go 安装失败,可稍后手动执行:goenv install $GO_VERSION"
    fi
  else
    WARN "未能获取 Go 版本列表(网络问题),goenv 已装好,稍后手动 goenv install"
  fi
fi
# 提示:.zshrc 中保留 GOPATH=$HOME/go、GOPROXY= https://goproxy.cn ,direct 即可

# --- Node(nvm) ---
if [[ ! -d "$HOME/.nvm" ]]; then
  INFO "安装 nvm ..."
  NVM_LATEST="$(curl -fsSL https://api.github.com/repos/nvm-sh/nvm/releases/latest 2>/dev/null | grep '"tag_name"' | cut -d'"' -f4)"
  NVM_VERSION="${NVM_LATEST:-v0.40.3}"
  curl -fsSL "https://raw.githubusercontent.com/nvm-sh/nvm/$NVM_VERSION/install.sh" | bash \
    && OK "nvm 已安装" || WARN "nvm 安装失败"
fi
export NVM_DIR="$HOME/.nvm"
if [[ -s "$NVM_DIR/nvm.sh" ]]; then
  \. "$NVM_DIR/nvm.sh"
  if command -v node >/dev/null 2>&1; then
    OK "Node $(node -v) 已就绪"
  else
    INFO "安装 Node.js LTS ..."
    nvm install --lts && nvm alias default 'lts/*' && OK "Node $(node -v) 已安装" \
      || WARN "Node 安装失败,可稍后手动执行:nvm install --lts"
  fi
fi

# --- Python(pyenv + Homebrew python) ---
for pkg in pyenv python@3.12; do
  if brew list --versions "$pkg" >/dev/null 2>&1; then
    OK "$pkg 已安装"
  else
    INFO "安装 $pkg ..."
    brew install "$pkg" && OK "$pkg 安装完成" || WARN "$pkg 安装失败"
  fi
done

if [[ "$INSTALL_PY39" == "1" ]]; then
  if brew list --versions python@3.9 >/dev/null 2>&1; then
    OK "python@3.9 已安装"
  else
    WARN "python@3.9 已弃用(2026-10-15 起停止提供),尝试安装..."
    brew install python@3.9 && OK "python@3.9 安装完成" \
      || WARN "python@3.9 安装失败,建议改用:pyenv install 3.9"
  fi
else
  INFO "已跳过 python@3.9(已弃用)。如需 3.9,请执行:brew install python@3.9 或 pyenv install 3.9"
fi
# 提示:旧配置中的 venv(perf_env / harmony_env / android_env / langchain_env / analyse_env)
#       需在对应项目下重新创建,例如:python3.10 -m venv ~/perf_env && source ~/perf_env/bin/activate

# --- Java 11(Temurin,安装到 /Library/Java/JavaVirtualMachines,与旧配置目录结构一致) ---
if /usr/libexec/java_home -v 11 >/dev/null 2>&1; then
  OK "JDK 11 已存在:$(/usr/libexec/java_home -v 11)"
else
  INFO "安装 JDK 11(Temurin,pkg 安装会要求输入管理员密码)..."
  brew install --cask temurin@11 && OK "JDK 11 安装完成" \
    || WARN "JDK 11 安装失败,可尝试:brew install openjdk@11"
fi
# 建议:.zshrc 中 JAVA_HOME 改用自动探测,避免写死路径:
#   export JAVA_HOME=$(/usr/libexec/java_home -v 11)

# --- PHP 8.2 ---
if brew list --versions php@8.4 >/dev/null 2>&1; then
  OK "php@8.4 已安装"
else
  INFO "安装 php@8.4 ..."
  brew install php@8.4 && OK "php@8.4 安装完成" || WARN "php@8.4 安装失败"
fi
# 提示:php@8.4 上游将于 2026-12 停止安全支持;无兼容性要求时建议改用 php@8.4 / php

# =============================================================
#  6. Web 服务 / 数据库:nginx / redis / mysql
# =============================================================
SECTION "nginx / redis / mysql"

for pkg in nginx redis mysql@8.4; do
  if brew list --versions "$pkg" >/dev/null 2>&1; then
    OK "$pkg 已安装"
  else
    INFO "安装 $pkg ..."
    brew install "$pkg" && OK "$pkg 安装完成" || WARN "$pkg 安装失败"
  fi
done

if [[ "$INSTALL_MYSQL_80" == "1" ]]; then
  if brew list --versions mysql@8.0 >/dev/null 2>&1; then
    OK "mysql@8.0 已安装"
  else
    INFO "安装 mysql@8.0 ..."
    brew install mysql@8.0 && OK "mysql@8.0 安装完成" || WARN "mysql@8.0 安装失败"
  fi
fi

if [[ "$START_SERVICES" == "1" ]]; then
  INFO "启动服务:nginx、redis、mysql@8.4 ..."
  brew services start nginx    >/dev/null 2>&1 || WARN "nginx 启动失败"
  brew services start redis    >/dev/null 2>&1 || WARN "redis 启动失败"
  brew services start mysql@8.4 >/dev/null 2>&1 || WARN "mysql@8.4 启动失败"
  OK "服务已启动"
else
  INFO "未自动启动服务,需要时执行:brew services start nginx|redis|mysql@8.4"
fi
# 提示:这些包多为 keg-only,.zshrc 中旧配置的 PATH 行(/opt/homebrew/opt/...)可直接沿用

# =============================================================
#  7. Android SDK / adb(安装到 ~/Library/Android/sdk,与旧配置一致)
# =============================================================
SECTION "Android SDK / adb"
ANDROID_HOME="$HOME/Library/Android/sdk"
mkdir -p "$ANDROID_HOME/cmdline-tools"
if command -v adb >/dev/null 2>&1 || [[ -x "$ANDROID_HOME/platform-tools/adb" ]]; then
  OK "adb 已就绪"
else
  INFO "下载 Android commandline-tools ..."
  ZIP="/tmp/android-cmdline-tools.zip"
  if curl -fsSL -o "$ZIP" "https://dl.google.com/android/repository/commandlinetools-mac-11076708_latest.zip"; then
    rm -rf /tmp/android-cmdline-tools && mkdir -p /tmp/android-cmdline-tools
    unzip -q "$ZIP" -d /tmp/android-cmdline-tools
    mkdir -p "$ANDROID_HOME/cmdline-tools/latest"
    mv /tmp/android-cmdline-tools/cmdline-tools/* "$ANDROID_HOME/cmdline-tools/latest/" 2>/dev/null || true
    yes | "$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" --sdk_root="$ANDROID_HOME" "platform-tools" >/dev/null 2>&1 \
      && OK "adb / platform-tools 已安装到 $ANDROID_HOME" \
      || WARN "platform-tools 安装失败(可重试;或安装 Android Studio 后自动获得 SDK)"
  else
    WARN "commandline-tools 下载失败,建议安装 Android Studio(自动配置 SDK 到 ~/Library/Android/sdk)"
  fi
fi
# 提示:.zshrc 中 ANDROID_HOME / platform-tools 的 PATH 行可直接沿用

# =============================================================
#  8. iOS 自动化:tidevice(WDA 需 Xcode)
# =============================================================
SECTION "iOS 自动化:tidevice"
if command -v tidevice >/dev/null 2>&1; then
  OK "tidevice 已安装"
else
  INFO "安装 tidevice(pip)..."
  if "$BREW_PREFIX/bin/pip3" install -U "tidevice[openssl]" >/dev/null 2>&1 \
     || python3 -m pip install --user -U tidevice >/dev/null 2>&1; then
    OK "tidevice 已安装"
  else
    WARN "tidevice 安装失败,可稍后手动执行:pip3 install -U 'tidevice[openssl]'"
  fi
fi
# 提示:WDA(WebDriverAgentRunner.xctrunner)需在 Mac App Store 安装 Xcode 后自行构建,脚本不处理

# =============================================================
#  9. Docker
# =============================================================
SECTION "Docker"
if [[ "$INSTALL_DOCKER_DESKTOP" == "1" ]]; then
  if brew list --cask --versions docker >/dev/null 2>&1; then
    OK "Docker Desktop 已安装"
  else
    INFO "安装 Docker Desktop(GUI 应用,首次打开需手动接受协议)..."
    brew install --cask docker && OK "Docker Desktop 安装完成" || WARN "Docker Desktop 安装失败"
  fi
  # 轻量 CLI 替代方案(无 GUI):brew install colima docker docker-compose
else
  INFO "已跳过 Docker Desktop。CLI 轻量方案:brew install colima docker docker-compose"
fi

# =============================================================
#  10. 百度内部工具(需内网/官方安装器,本脚本仅提示)
# =============================================================
SECTION "百度内部工具(请按内网文档安装)"
cat <<'EOF'
以下工具来自旧 .zshrc,属于公司内部工具,脚本无法自动安装,
请通过内网安装器/官方文档完成,装好后旧 .zshrc 中的 PATH 行可直接沿用:
  - Comate CLI(~/.comate/bin,含 zulu-cli)
  - DuCC / baidu-cc(~/.comate/baidu-cc、~/.baidu-cc)
  - baidu-cx(~/.baidu-cx)
  - icode-cli(~/.icode/bin)
  - relay-cli(~/.local/bin)
  - 鸿蒙 HDC:通过 DevEco Studio 安装 OpenHarmony SDK
    (~/.local/bin 或 ~/Library/OpenHarmony/Sdk/<version>/toolchains)
  - relay ssh 别名依赖你的 SSH key,迁移后需重新配置密钥
EOF

# =============================================================
#  11. 汇总与下一步
# =============================================================
SECTION "完成汇总"
OK "以下软件已安装/确认:"
printf "  - Homebrew %s\n" "$(brew --version | head -1)"
printf "  - git / coreutils / gnu-sed\n"
printf "  - oh-my-zsh + zsh-autosuggestions + zsh-syntax-highlighting\n"
printf "  - starship / lsd / fastfetch\n"
printf "  - goenv + Go %s\n" "${GO_VERSION:-未安装}"
printf "  - nvm + Node %s\n" "$(command -v node >/dev/null 2>&1 && node -v || echo 未安装)"
printf "  - pyenv / python@3.12\n"
printf "  - JDK 11:%s\n" "$(/usr/libexec/java_home -v 11 2>/dev/null || echo 未安装)"
printf "  - php@8.4 / nginx / redis / mysql@8.4\n"
printf "  - Android platform-tools (adb) / tidevice\n"

cat <<'EOF'

下一步(手动操作):
1) 把旧 Mac 的 ~/.zshrc 拷贝到新机,并替换用户目录路径:
     cp <旧机导出的 .zshrc> ~/.zshrc
     sed -i '' "s|/Users/wangkaikai01|$HOME|g" ~/.zshrc
2) 建议把 JAVA_HOME 改为自动探测(替换旧配置中的写死路径):
     export JAVA_HOME=$(/usr/libexec/java_home -v 11)
3) 新开一个终端窗口(或 source ~/.zshrc)使配置生效。
4) 国内网络若下载慢,参照脚本顶部注释配置 Homebrew 镜像后再运行。
EOF

echo
OK "全部完成!如果某一步失败,按提示手动补齐即可,脚本可重复运行(幂等)。"
#(注:内容由AI生成)

posted @ 2026-09-22 21:39  alisleepy  阅读(8)  评论(0)    收藏  举报