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生成)
本文来自博客园,作者:alisleepy,转载请注明原文链接:https://www.cnblogs.com/alisleepy/p/23084822

浙公网安备 33010602011771号