install.sh 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #!/bin/bash
  2. # Author: Jrohy
  3. # Github: https://github.com/Jrohy/go-install
  4. # cancel centos alias
  5. [[ -f /etc/redhat-release ]] && unalias -a
  6. INSTALL_VERSION=""
  7. CAN_GOOGLE=1
  8. FORCE_MODE=0
  9. SUDO=""
  10. OS="Linux"
  11. PROXY_URL="https://goproxy.cn"
  12. #######color code########
  13. RED="31m"
  14. GREEN="32m"
  15. YELLOW="33m"
  16. BLUE="36m"
  17. FUCHSIA="35m"
  18. colorEcho(){
  19. COLOR=$1
  20. echo -e "\033[${COLOR}${@:2}\033[0m"
  21. }
  22. #######get params#########
  23. while [[ $# > 0 ]];do
  24. KEY="$1"
  25. case $KEY in
  26. -v|--version)
  27. INSTALL_VERSION="$2"
  28. echo -e "准备安装$(colorEcho ${BLUE} $INSTALL_VERSION)版本golang..\n"
  29. shift
  30. ;;
  31. -f)
  32. FORCE_MODE=1
  33. echo -e "强制更新golang..\n"
  34. ;;
  35. *)
  36. # unknown option
  37. ;;
  38. esac
  39. shift # past argument or value
  40. done
  41. #############################
  42. ipIsConnect(){
  43. ping -c2 -i0.3 -W1 $1 &>/dev/null
  44. if [ $? -eq 0 ];then
  45. return 0
  46. else
  47. return 1
  48. fi
  49. }
  50. setupEnv(){
  51. if [[ $SUDO == "" ]];then
  52. PROFILE_PATH="/etc/profile"
  53. elif [[ -e ~/.zshrc ]];then
  54. PROFILE_PATH="$HOME/.zprofile"
  55. fi
  56. if [[ $SUDO == "" && -z `echo $GOPATH` ]];then
  57. while :
  58. do
  59. read -p "默认GOPATH路径: `colorEcho $BLUE /home/go`, 回车直接使用或者输入自定义绝对路径: " GOPATH
  60. if [[ $GOPATH ]];then
  61. if [[ ${GOPATH:0:1} != "/" ]];then
  62. colorEcho $YELLOW "请输入绝对路径!"
  63. continue
  64. fi
  65. else
  66. GOPATH="/home/go"
  67. fi
  68. break
  69. done
  70. echo "GOPATH值为: `colorEcho $BLUE $GOPATH`"
  71. echo "export GOPATH=$GOPATH" >> $PROFILE_PATH
  72. echo 'export PATH=$PATH:$GOPATH/bin' >> $PROFILE_PATH
  73. mkdir -p $GOPATH
  74. fi
  75. if [[ -z `echo $PATH|grep /usr/local/go/bin` ]];then
  76. echo 'export PATH=$PATH:/usr/local/go/bin' >> $PROFILE_PATH
  77. fi
  78. source $PROFILE_PATH
  79. }
  80. checkNetwork(){
  81. ipIsConnect "golang.org"
  82. [[ ! $? -eq 0 ]] && CAN_GOOGLE=0
  83. }
  84. setupProxy(){
  85. if [[ $CAN_GOOGLE == 0 && `go env|grep proxy.golang.org` ]]; then
  86. go env -w GO111MODULE=on
  87. go env -w GOPROXY=$PROXY_URL,direct
  88. colorEcho $GREEN "当前网络环境为国内环境, 成功设置goproxy代理!"
  89. fi
  90. }
  91. sysArch(){
  92. ARCH=$(uname -m)
  93. if [[ `uname -s` == "Darwin" ]];then
  94. OS="Darwin"
  95. if [[ "$ARCH" == "arm64" ]];then
  96. VDIS="darwin-arm64"
  97. else
  98. VDIS="darwin-amd64"
  99. fi
  100. else
  101. if [[ "$ARCH" == "i686" ]] || [[ "$ARCH" == "i386" ]]; then
  102. VDIS="linux-386"
  103. elif [[ "$ARCH" == *"armv7"* ]] || [[ "$ARCH" == "armv6l" ]]; then
  104. VDIS="linux-armv6l"
  105. elif [[ "$ARCH" == *"armv8"* ]] || [[ "$ARCH" == "aarch64" ]]; then
  106. VDIS="linux-arm64"
  107. elif [[ "$ARCH" == *"s390x"* ]]; then
  108. VDIS="linux-s390x"
  109. elif [[ "$ARCH" == "ppc64le" ]]; then
  110. VDIS="linux-ppc64le"
  111. elif [[ "$ARCH" == "x86_64" ]]; then
  112. VDIS="linux-amd64"
  113. fi
  114. fi
  115. [ $(id -u) != "0" ] && SUDO="sudo"
  116. }
  117. installGo(){
  118. if [[ -z $INSTALL_VERSION ]];then
  119. echo "正在获取最新版golang..."
  120. if [[ $CAN_GOOGLE == 0 ]];then
  121. INSTALL_VERSION=`curl -s https://golang.google.cn/dl/|grep -w downloadBox|grep src|grep -oE '[0-9]+\.[0-9]+\.?[0-9]*'|head -n 1`
  122. else
  123. INSTALL_VERSION=`curl -s https://github.com/golang/go/tags|grep releases/tag|grep -v rc|grep -v beta|grep -oE '[0-9]+\.[0-9]+\.?[0-9]*'|head -n 1`
  124. fi
  125. [[ ${INSTALL_VERSION: -1} == '.' ]] && INSTALL_VERSION=${INSTALL_VERSION%?}
  126. [[ -z $INSTALL_VERSION ]] && { colorEcho $YELLOW "\n获取go版本号失败!"; exit 1; }
  127. echo "最新版golang: `colorEcho $BLUE $INSTALL_VERSION`"
  128. if [[ $FORCE_MODE == 0 && `command -v go` ]];then
  129. if [[ `go version|awk '{print $3}'|grep -Eo "[0-9.]+"` == $INSTALL_VERSION ]];then
  130. return
  131. fi
  132. fi
  133. fi
  134. FILE_NAME="go${INSTALL_VERSION}.$VDIS.tar.gz"
  135. local TEMP_PATH=`mktemp -d`
  136. curl -H 'Cache-Control: no-cache' -L https://dl.google.com/go/$FILE_NAME -o $FILE_NAME
  137. tar -C $TEMP_PATH -xzf $FILE_NAME
  138. if [[ $? != 0 ]];then
  139. colorEcho $YELLOW "\n解压失败! 正在重新下载..."
  140. rm -rf $FILE_NAME
  141. curl -H 'Cache-Control: no-cache' -L https://dl.google.com/go/$FILE_NAME -o $FILE_NAME
  142. tar -C $TEMP_PATH -xzf $FILE_NAME
  143. [[ $? != 0 ]] && { colorEcho $YELLOW "\n解压失败!"; rm -rf $TEMP_PATH $FILE_NAME; exit 1; }
  144. fi
  145. [[ -e /usr/local/go ]] && $SUDO rm -rf /usr/local/go
  146. $SUDO mv $TEMP_PATH/go /usr/local/
  147. rm -rf $TEMP_PATH $FILE_NAME
  148. }
  149. installUpdater(){
  150. if [[ $OS == "Linux" && ! -e /usr/local/bin/goupdate ]];then
  151. echo "source <(curl -L https://go-install.netlify.app/install.sh)" > /usr/local/bin/goupdate
  152. chmod +x /usr/local/bin/goupdate
  153. elif [[ $OS == "Darwin" && ! -e $HOME/go/bin/goupdate ]];then
  154. cat > $HOME/go/bin/goupdate << EOF
  155. #!/bin/zsh
  156. source <(curl -L https://go-install.netlify.app/install.sh)
  157. EOF
  158. chmod +x $HOME/go/bin/goupdate
  159. fi
  160. }
  161. main(){
  162. sysArch
  163. checkNetwork
  164. installGo
  165. setupEnv
  166. setupProxy
  167. installUpdater
  168. echo -e "golang `colorEcho $BLUE $INSTALL_VERSION` 安装成功!"
  169. }
  170. main