#!/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 <<EOF
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' 使環境變量生效" ? ?