Linux安装go语言环境脚本

Golang安装

默认安装

curl -SL https://my5353.com/confgo | bash

使用帮助

curl -SL https://my5353.com/confgo | bash /dev/stdin -h

安装指定版本

curl -SL https://my5353.com/confgo | bash /dev/stdin -v "1.18.6"

清除已安装环境

curl -SL https://my5353.com/confgo | bash /dev/stdin -r

完整脚本

#!/usr/bin/env bash

###
 # @Descripttion : Install Go Sdk In Linux
 # @version      : v1.0.0
 # @Author       : neet11 neetwy@163.com
 # @Date         : 2022-09-27 03:01:36
 # @LastEditors  : neet11 neetwy@163.com
 # @LastEditTime : 2022-10-06 13:52:43
 # @FilePath     : /shell/config-dev-env/install_golang.sh
### 

#set -o xtrace           # Print commands and their arguments

set -o errexit          # Exit on most errors (see the manual)
set -o errtrace         # Make sure any error trap is inherited
set -o nounset          # Disallow expansion of unset variables
set -o pipefail         # Use last non-zero exit code in a pipeline


# global constant
TAG="CMD"
#LOG_PATH=$( cd "$(dirname "${BASH_SOURCE[0]}")" && pwd )/logs
LOG_PATH="/tmp/shell/logs"
LOG_FILE="${LOG_PATH}/install_golang_$(date +"%Y%m%d").log"
HIDE_LOG=true

# global environment variable
go_sdk_version="1.19.1"
go_sdk_package="go${go_sdk_version}.linux-amd64.tar.gz"


# log handler
function log() {
    [ ! -d "${LOG_PATH}" ] && mkdir -p "${LOG_PATH}"
    if [ $HIDE_LOG ]; then
        echo -e "[$(date +"%Y/%m/%d:%H:%M:%S %z")] [$(whoami)] [$TAG]" "${@}" >> "${LOG_FILE}"
    else
        echo "[$(date +"%Y/%m/%d:%H:%M:%S %z")] [$(whoami)] [$TAG]" "${@}" | tee -a "${LOG_FILE}"
    fi
}

# trap err signal
function script_trap_err() {
    local exit_code=1

    # Disable the error trap handler to prevent potential recursion
    trap - ERR

    # Consider any further errors non-fatal to ensure we run to completion
    set +o errexit
    set +o pipefail

    log "[E] ERROR" "${@}" 
    status_closure clear_go_env

    exit "$exit_code"
}

# trap exit signal
function script_trap_exit() {
    log "[I] shell exec done."
}

# define:info(32green) warn(31red) process(33yellow)
function print_color () {
  case $1 in
    red) echo -e "\033[31m$2 \033[0m" ;;
    green) echo -e "\033[32m$2 \033[0m" ;;
    yellow) echo -e "\033[33m$2 \033[0m" ;;
    blue) echo -e "\033[34m$2 \033[0m" ;;
    *) echo -e "\033[31m[Color Error]$2 \033[0m" ;;
   esac
}

# check the command execution status
function status_closure () {
  print_color "green" "${1}"
  eval "${1}"
  print_color "green" "${1} executed successfully"
}

# show help info
function help() {
  echo "Usage:"
  echo "    -h          : display this help and exit"
  echo "    -v          : input golang version default 1.19.1"
  echo "    -r          : remove golang env and exit"
  exit 1
}

# config files
function config_profile() {
  print_color "blue" "append go env to /etc/profile"

  if [ "$(grep -c "GOROOT" /etc/profile)" -eq '0' ] 
  then 
    append_profile="sudo tee -a /etc/profile"
    echo -e "\n#GOROOT PATH\nexport GOROOT=/usr/local/go" | $append_profile
    echo -e "#GOBIN PATH\nexport GOBIN=\$GOROOT/bin" | $append_profile
    echo -e "#GOHOME PATH\nexport GOPATH=\$HOME/go" | $append_profile
    echo -e "\nexport PATH=\$PATH:\$GOPATH:\$GOBIN:\$GOROOT" | $append_profile
    # shellcheck source=/dev/null
    source /etc/profile
  else
    print_color "blue" "/etc/profile has been added!"
  fi
}

# get golang sdk url
function download_sdk_pkg() {
  mkdir -p "${HOME}"/tools
  print_color "blue" "download golang sdk in ${HOME}/tools/"
  if [ ! -f "${HOME}"/tools/"${go_sdk_package}" ]
  then 
    wget -P "${HOME}"/tools https://gomirrors.org/dl/go/"${go_sdk_package}"
  fi
}

# unarchive sdk to dir
function install_go_sdk() {
  if [ ! -d /usr/local/go"${go_sdk_version}" ]
  then
    sudo tar -zxf "${HOME}"/tools/"${go_sdk_package}" -C /usr/local/
    print_color "green" "unarchive_go_sdk executed successfully"
    sudo mv /usr/local/go /usr/local/go"${go_sdk_version}"
    print_color "blue" "unarchive golang sdk in /usr/local/"
  else
    print_color "blue" "/usr/local/go directory already exists"
    sudo rm -rf /usr/local/go
  fi
  sudo ln -s /usr/local/go"${go_sdk_version}" /usr/local/go
}

# config go path env
function config_go_env() {
  go env -w GO111MODULE=on && \
  go env -w GOPROXY=https://goproxy.cn,direct && \
  go env -w GOROOT=/usr/local/go && \
  go env -w GOBIN=/usr/local/go/bin && \
  go env -w GOPATH="${HOME}"/go
}

# create go paht dir
function create_go_path() {
  mkdir -p "${HOME}"/go/{bin,pkg,src}
  print_color "blue" "create golang path in ${HOME}/go"
}

# entry function 
function run_install_golang() {
  status_closure config_profile 
  status_closure download_sdk_pkg
  status_closure install_go_sdk
  status_closure config_go_env
  status_closure create_go_path
  print_color "green" "golang-${go_sdk_version} installation completed!" 
  print_color "yellow" "exec \"source /etc/profile\" after installation completed !!!"
}

# clean go env
function clear_go_env() {
  sudo rm -rf "${HOME}"/go && \
  sudo rm -rf "${HOME}"/tools/go* && \
  sudo rm -rf /usr/local/go* && \
  sudo sed -i '/GOROOT/d'  /etc/profile > /dev/null && \
  sudo sed -i '/GOPATH/d'  /etc/profile > /dev/null && \
  sudo sed -i '/GOHOME/d'  /etc/profile > /dev/null && \
  sudo sed -i '/GOBIN/d'  /etc/profile > /dev/null && \
  sudo sed -i ':n;/^\n*$/{$! N;$d;bn}'  /etc/profile
  print_color "green" "golang env clear completed!" 
}

function main() {
  trap script_trap_err INT TERM QUIT HUP ERR
  trap script_trap_exit EXIT
  log "[I] shell start"

  if [ $# -ne 0 ]
  then
    case $1 in
        -h|help)
          help
        ;;
        -v|version)
          go_sdk_version=$2
          go_sdk_package=go"${go_sdk_version}".linux-amd64.tar.gz
          status_closure run_install_golang
        ;;
        -r|remove)
          status_closure clear_go_env
        ;;
        *)
          print_color "red" "unknown parameter" && help
        ;;
    esac
  else
    status_closure run_install_golang
  fi
}

# run script
main "${@}"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354