#!/bin/bash
# 检查是否以root用户运行
if [ "$(id -u)" -ne 0 ]; then
echo "请使用root权限运行此脚本"
exit 1
fi# 检查是否安装了必要的工具
for cmd in curl wget tar; do
if ! command -v $cmd &> /dev/null; then
echo "错误: 需要安装 $cmd"
exit 1
fi
done# 获取最新版本号
echo "正在获取最新Go版本..."
LATEST_VERSION=$(curl -s https://go.dev/dl/ | grep -o 'go[0-9.]\+\.linux-amd64.tar.gz' | head -1 | sed 's/go\([0-9.]\+\)\.linux-amd64.tar.gz/\1/')if [ -z "$LATEST_VERSION" ]; then
echo "无法获取最新版本信息"
exit 1
fiecho "最新版本是: $LATEST_VERSION"
# 创建临时目录
TMP_DIR=$(mktemp -d)
cd $TMP_DIR# 带进度条的下载函数
download_with_progress() {
echo "正在下载Go $LATEST_VERSION..."
wget --progress=bar:force:noscroll -O go.tar.gz "https://go.dev/dl/go$LATEST_VERSION.linux-amd64.tar.gz"
if [ $? -ne 0 ]; then
echo "下载失败"
cleanup
exit 1
fi
}# 带进度条的解压函数
extract_with_progress() {
echo "正在解压..."
total_files=$(tar -tf go.tar.gz | wc -l)
current=0
tar -xzf go.tar.gz --checkpoint=.100 --checkpoint-action="exec=printf '\r已解压: %.1f%%' \$((100*$current/$total_files))" -C /usr/local
# 确保显示100%
echo -e "\r已解压: 100.0%"
}# 清理函数
cleanup() {
cd /
rm -rf $TMP_DIR
}# 陷阱,确保脚本中断时清理临时文件
trap cleanup EXIT# 执行下载
download_with_progress# 执行解压
echo "正在安装到 /usr/local/go..."
rm -rf /usr/local/go
extract_with_progress# 配置环境变量
echo "正在配置环境变量..."
cat > /etc/profile.d/go.sh <export PATH=\$PATH:/usr/local/go/bin
export GOPATH=\$HOME/go
export PATH=\$PATH:\$GOPATH/bin
export GOPROXY=https://goproxy.cn,direct
export GOSUMDB=off
EOF# 使环境变量生效
source /etc/profile.d/go.sh# 验证安装
echo "正在验证安装..."
go versionif [ $? -ne 0 ]; then
echo "Go安装失败"
exit 1
fiecho "Go $LATEST_VERSION 安装成功!"
echo "环境变量已配置,代理已设置为 https://goproxy.cn"
echo "请重新登录或执行 'source /etc/profile' 使环境变量生效"