GO 自动化安装脚本(适用于 Linux 系统)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

在使用 Go 语言进行开发时通常需要手动下载并安装 Go以及配置相关的环境变量和代理如 Go Proxy 和 Go Modules 等。这很可能会导致一些麻烦和浪费时间。为了解决这个问题我决定开发一个一键安装并配置 Go 的脚本。这个脚本在 Linux 系统中使用让安装和配置的过程更加简单快捷。

脚本概览

以下是脚本的内容概述

  1. 从网页获取 Go 版本列表并让用户选择安装的版本
  2. 检测用户是否有在 /usr/local/go 目录中安装的权限并询问是否需要安装在此位置
  3. 如果用户选择在 /usr/local/go 目录中安装则安装在此位置否则安装在 ~/go 目录中
  4. 下载并解压指定版本的 Go
  5. 配置环境变量将 Go 的 bin 目录添加到 PATH
  6. 检查安装是否成功
  7. 配置 Go Proxy 环境变量
  8. 询问用户是否需要开启 Go Modules 功能并根据用户的选择进行配置
  9. 打印 Go Proxy 和 Go Modules 相关信息

注意如果您不想观看以下详细的讲解部分请直接跳至完整脚本

脚本详细讲解

1. 获取 Go 版本列表

首先通过 wget 命令从网页获取 Go 版本列表并将其保存到一个临时文件中。然后使用 grep 命令从临时文件中解析出版本列表并按照版本号降序排列。最后通过 select 命令让用户选择需要安装的 Go 版本。

echo "正在获取 Go 版本列表请稍候..."
temp_file=$(mktemp --tmpdir go-version.XXXXXX)
wget -O $temp_file https://studygolang.com/dl

versions=$(cat $temp_file | grep -oP 'go\d+\.\d+\.\d+' | sort -Vru)

rm -f $temp_file

echo "可用的go版本如下:"
select version in ${versions}; do
  if [ -n "${version}" ]; then
    break
  else
    echo "输入错误,请重新选择版本"
  fi
done

2. 检测安装权限

接下来检测用户是否具有在 /usr/local/go 目录中安装的权限。如果有权限询问用户是否需要安装在此位置。

if [ -w "/usr/local" ]; then
  echo "您拥有在 /usr/local/go 目录中安装的权限请确认是否安装在此位置."
  read -p "(yes/no, 默认安装在此位置): " install_in_usr_local
  
  if [[ $install_in_usr_local =~ ^[Yy] ]]; then
    umask 0022
    sudo mkdir -p /usr/local/go
  fi
fi

3. 选择安装路径

根据用户的选择确定 Go 的安装路径。如果用户选择在 /usr/local/go 目录中安装则安装在此位置否则安装在 ~/go 目录中。同时创建安装目录。

if [[ "$install_in_usr_local" == "y"* || "$install_in_usr_local" == "Y"* ]]; then
  go_path="/usr/local/go"
else
  echo "正在查找合适的安装路径, 请稍候..."
  go_path=$(find ~/ -name "go" -type d -prune)
  if [ -z "$go_path" ]; then
    echo "无法找到合适的安装路径请手动输入一个安装路径."
    read -p "(默认为 ~/go): " go_path
    go_path=${go_path:-~/go}
    echo "已选择安装路径$go_path"
  fi
fi

if [ ! -d "$go_path" ]; then
  mkdir -p "$go_path"
  echo "创建 $go_path 目录成功"
fi

4. 下载并解压 Go

下载指定版本的 Go并解压到之前确定的安装路径。

if [ -f "$go_path/$version.linux-amd64.tar.gz" ]; then
  echo "文件已存在,不需要下载"
else
  if wget -P "$go_path" https://studygolang.com/dl/golang/$version.linux-amd64.tar.gz; then
    echo "下载成功"
  else
    echo "下载失败"
    exit 1
  fi
fi

cd "$go_path" || exit
if rm -rf "$go_path/go" && tar -C "$go_path" -xzf "$go_path/$version.linux-amd64.tar.gz"; then
  echo "解压成功"
else
  echo "解压失败"
  exit 1
fi

5. 配置环境变量

将 Go 的 bin 目录添加到 PATH 环境变量中以便在任何位置都可以直接使用 Go 命令。

if grep -q "export PATH=\$PATH:$go_path/go/bin" ~/.profile; then
  echo "配置已存在,不需要添加"
else
  if echo 'export PATH=$PATH:'"$go_path/go"'/bin' >> ~/.profile; then
    echo "配置添加成功"
  else
    echo "配置添加失败"
    exit 1
  fi
fi

source ~/.profile

6. 检查安装是否成功

执行 go version 命令检查安装是否成功。

if "$go_path/go/bin/go" version; then
  echo "安装成功"
else
  echo "安装失败"
  exit 1
fi

7. 配置 Go Proxy 环境变量

设置 Go Proxy 环境变量以便在使用 Go Modules 时能够更快地下载依赖。

read -p "请输入 GOPROXY 环境变量的值(默认值:https://goproxy.cn,direct): " goproxy
if [ -z "$goproxy" ]; then
  echo "使用默认值 https://goproxy.cn,direct"
  goproxy="https://goproxy.cn,direct"
fi
"$go_path/go/bin/go" env -w GOPROXY="$goproxy"

8. 配置 Go Modules 功能

询问用户是否需要开启 Go Modules 功能并根据用户的选择进行配置。

read -p "是否要开启 Go Modules 功能(yes/no,默认开启)" use_module
case "$use_module" in
  [nN][oO] | [nN])
    echo "已选择不开启 Go Modules 功能"
    ;;
  *)
    "$go_path/go/bin/go" env -w GO111MODULE=on
    echo "已开启 Go Modules 功能"
    ;;
esac

9. 打印 Go Proxy 和 Go Modules 相关信息

最后打印 Go Proxy 和 Go Modules 相关信息以便用户确认配置是否正确。

echo "已经配置了 GOPROXY 环境变量为 $goproxy"
"$go_path/go/bin/go" env | grep -E "GOPROXY|GO111MODULE"

echo "脚本执行完毕"

完整脚本

以下是完整的一键安装并配置 Go 的脚本

#!/bin/bash

# 获取网页内容并显示实时下载信息
echo "正在获取 Go 版本列表请稍候..."
temp_file=$(mktemp --tmpdir go-version.XXXXXX)
wget -O $temp_file https://studygolang.com/dl

# 从临时文件中解析版本列表
versions=$(cat $temp_file | grep -oP 'go\d+\.\d+\.\d+' | sort -Vru)

# 删除临时文件
rm -f $temp_file

# 输出所有版本的go列表
echo "可用的go版本如下:"
select version in ${versions}; do
  if [ -n "${version}" ]; then
    break
  else
    echo "输入错误,请重新选择版本"
  fi
done

# 检测用户是否有在 /usr/local/go 目录中安装的权限
if [ -w "/usr/local" ]; then
  echo "您拥有在 /usr/local/go 目录中安装的权限请确认是否安装在此位置."
  read -p "(yes/no, 默认安装在此位置): " install_in_usr_local
  
  if [[ $install_in_usr_local =~ ^[Yy] ]]; then
    # 使用 umask 设置默认目录和文件的权限
    umask 0022
    sudo mkdir -p /usr/local/go
  fi
fi 

# 如果用户选择在 /usr/local/go 目录中安装则安装在此位置否则安装在 ~/go 目录中
if [[ "$install_in_usr_local" == "y"* || "$install_in_usr_local" == "Y"* ]]; then
  go_path="/usr/local/go"
else
  echo "正在查找合适的安装路径, 请稍候..."
  go_path=$(find ~/ -name "go" -type d -prune)
  if [ -z "$go_path" ]; then
    echo "无法找到合适的安装路径请手动输入一个安装路径."
    read -p "(默认为 ~/go): " go_path
    go_path=${go_path:-~/go}
    echo "已选择安装路径$go_path"
  fi
fi

# 创建安装目录
if [ ! -d "$go_path" ]; then
  mkdir -p "$go_path"
  echo "创建 $go_path 目录成功"
fi

# 下载指定版本的go
if [ -f "$go_path/$version.linux-amd64.tar.gz" ]; then
  echo "文件已存在,不需要下载"
else
  if wget -P "$go_path" https://studygolang.com/dl/golang/$version.linux-amd64.tar.gz; then
    echo "下载成功"
  else
    echo "下载失败"
    exit 1
  fi
fi

# 进入安装目录,执行rm和解压
cd "$go_path" || exit
if rm -rf "$go_path/go" && tar -C "$go_path" -xzf "$go_path/$version.linux-amd64.tar.gz"; then
  echo "解压成功"
else
  echo "解压失败"
  exit 1
fi

# 检测是否需要添加export语句
if grep -q "export PATH=\$PATH:$go_path/go/bin" ~/.profile; then
  echo "配置已存在,不需要添加"
else
  if echo 'export PATH=$PATH:'"$go_path/go"'/bin' >> ~/.profile; then
    echo "配置添加成功"
  else
    echo "配置添加失败"
    exit 1
  fi
fi

# 更新配置文件
source ~/.profile

# 执行go version检查是否安装成功
if "$go_path/go/bin/go" version; then
  echo "安装成功"
else
  echo "安装失败"
  exit 1
fi

# 配置 GOPROXY 环境变量
read -p "请输入 GOPROXY 环境变量的值(默认值:https://goproxy.cn,direct): " goproxy
if [ -z "$goproxy" ]; then
  echo "使用默认值 https://goproxy.cn,direct"
  goproxy="https://goproxy.cn,direct"
fi
"$go_path/go/bin/go" env -w GOPROXY="$goproxy"

# 询问用户是否开启 Go Modules 功能
read -p "是否要开启 Go Modules 功能(yes/no,默认开启)" use_module
case "$use_module" in
  [nN][oO] | [nN])
    echo "已选择不开启 Go Modules 功能"
    ;;
  *)
    "$go_path/go/bin/go" env -w GO111MODULE=on
    echo "已开启 Go Modules 功能"
    ;;
esac

# 打印 goproxy 和 go module 相关信息
echo "已经配置了 GOPROXY 环境变量为 $goproxy"
"$go_path/go/bin/go" env | grep -E "GOPROXY|GO111MODULE"

echo "脚本执行完毕"

结语

希望这个脚本能帮助您快速地安装并配置 Go 环境。如果您有任何建议或问题请随时在评论区提出或与我讨论。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: golinux

“GO 自动化安装脚本(适用于 Linux 系统)” 的相关文章