install.sh 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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. can_google=1
  7. force_mode=0
  8. sudo=""
  9. os="Linux"
  10. install_version=""
  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. color_echo(){
  19. echo -e "\033[$1${@:2}\033[0m"
  20. }
  21. #######get params#########
  22. while [[ $# > 0 ]];do
  23. case "$1" in
  24. -v|--version)
  25. install_version="$2"
  26. echo -e "准备安装$(color_echo ${blue} $install_version)版本golang..\n"
  27. shift
  28. ;;
  29. -f)
  30. force_mode=1
  31. echo -e "强制更新golang..\n"
  32. ;;
  33. *)
  34. # unknown option
  35. ;;
  36. esac
  37. shift # past argument or value
  38. done
  39. #############################
  40. ip_is_connect(){
  41. ping -c2 -i0.3 -W1 $1 &>/dev/null
  42. if [ $? -eq 0 ];then
  43. return 0
  44. else
  45. return 1
  46. fi
  47. }
  48. setup_env(){
  49. if [[ $sudo == "" ]];then
  50. profile_path="/etc/profile"
  51. elif [[ -e ~/.zshrc ]];then
  52. profile_path="$HOME/.zprofile"
  53. fi
  54. if [[ $sudo == "" && -z `echo $GOPATH` ]];then
  55. while :
  56. do
  57. read -p "默认GOPATH路径: `color_echo $blue /home/go`, 回车直接使用或者输入自定义绝对路径: " GOPATH
  58. if [[ $GOPATH ]];then
  59. if [[ ${GOPATH:0:1} != "/" ]];then
  60. color_echo $yellow "请输入绝对路径!"
  61. continue
  62. fi
  63. else
  64. GOPATH="/home/go"
  65. fi
  66. break
  67. done
  68. echo "GOPATH值为: `color_echo $blue $GOPATH`"
  69. echo "export GOPATH=$GOPATH" >> $profile_path
  70. echo 'export PATH=$PATH:$GOPATH/bin' >> $profile_path
  71. mkdir -p $GOPATH
  72. fi
  73. if [[ -z `echo $PATH|grep /usr/local/go/bin` ]];then
  74. echo 'export PATH=$PATH:/usr/local/go/bin' >> $profile_path
  75. fi
  76. source $profile_path
  77. }
  78. check_network(){
  79. ip_is_connect "golang.org"
  80. [[ ! $? -eq 0 ]] && can_google=0
  81. }
  82. setup_proxy(){
  83. if [[ $can_google == 0 && `go env|grep proxy.golang.org` ]]; then
  84. go env -w GO111MODULE=on
  85. go env -w GOPROXY=$proxy_url,direct
  86. color_echo $green "当前网络环境为国内环境, 成功设置goproxy代理!"
  87. fi
  88. }
  89. sys_arch(){
  90. arch=$(uname -m)
  91. if [[ `uname -s` == "Darwin" ]];then
  92. os="Darwin"
  93. if [[ "$arch" == "arm64" ]];then
  94. vdis="darwin-arm64"
  95. else
  96. vdis="darwin-amd64"
  97. fi
  98. else
  99. if [[ "$arch" == "i686" ]] || [[ "$arch" == "i386" ]]; then
  100. vdis="linux-386"
  101. elif [[ "$arch" == *"armv7"* ]] || [[ "$arch" == "armv6l" ]]; then
  102. vdis="linux-armv6l"
  103. elif [[ "$arch" == *"armv8"* ]] || [[ "$arch" == "aarch64" ]]; then
  104. vdis="linux-arm64"
  105. elif [[ "$arch" == *"s390x"* ]]; then
  106. vdis="linux-s390x"
  107. elif [[ "$arch" == "ppc64le" ]]; then
  108. vdis="linux-ppc64le"
  109. elif [[ "$arch" == "x86_64" ]]; then
  110. vdis="linux-amd64"
  111. fi
  112. fi
  113. [ $(id -u) != "0" ] && sudo="sudo"
  114. }
  115. install_go(){
  116. if [[ -z $install_version ]];then
  117. echo "正在获取最新版golang..."
  118. count=0
  119. while :
  120. do
  121. install_version=""
  122. if [[ $can_google == 0 ]];then
  123. install_version=`curl -s --connect-timeout 15 -H 'Cache-Control: no-cache' https://go.dev/dl/|grep -w downloadBox|grep src|grep -oE '[0-9]+\.[0-9]+\.?[0-9]*'|head -n 1`
  124. else
  125. install_version=`curl -s --connect-timeout 15 -H 'Cache-Control: no-cache' 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`
  126. fi
  127. [[ ${install_version: -1} == '.' ]] && install_version=${install_version%?}
  128. if [[ -z $install_version ]];then
  129. if [[ $count < 3 ]];then
  130. color_echo $yellow "获取go版本号超时, 正在重试..."
  131. else
  132. color_echo $red "\n获取go版本号失败!"
  133. exit 1
  134. fi
  135. else
  136. break
  137. fi
  138. count=$(($count+1))
  139. done
  140. echo "最新版golang: `color_echo $blue $install_version`"
  141. fi
  142. if [[ $force_mode == 0 && `command -v go` ]];then
  143. if [[ `go version|awk '{print $3}'|grep -Eo "[0-9.]+"` == $install_version ]];then
  144. return
  145. fi
  146. fi
  147. file_name="go${install_version}.$vdis.tar.gz"
  148. local temp_path=`mktemp -d`
  149. curl -H 'Cache-Control: no-cache' -L https://dl.google.com/go/$file_name -o $file_name
  150. tar -C $temp_path -xzf $file_name
  151. if [[ $? != 0 ]];then
  152. color_echo $yellow "\n解压失败! 正在重新下载..."
  153. rm -rf $file_name
  154. curl -H 'Cache-Control: no-cache' -L https://dl.google.com/go/$file_name -o $file_name
  155. tar -C $temp_path -xzf $file_name
  156. [[ $? != 0 ]] && { color_echo $yellow "\n解压失败!"; rm -rf $temp_path $file_name; exit 1; }
  157. fi
  158. [[ -e /usr/local/go ]] && $sudo rm -rf /usr/local/go
  159. $sudo mv $temp_path/go /usr/local/
  160. rm -rf $temp_path $file_name
  161. }
  162. install_updater(){
  163. if [[ $os == "Linux" ]];then
  164. if [[ ! -e /usr/local/bin/goupdate || -z `cat /usr/local/bin/goupdate|grep '$@'` ]];then
  165. echo 'source <(curl -L https://go-install.netlify.app/install.sh) $@' > /usr/local/bin/goupdate
  166. chmod +x /usr/local/bin/goupdate
  167. fi
  168. elif [[ $os == "Darwin" ]];then
  169. if [[ ! -e $HOME/go/bin/goupdate || -z `cat $HOME/go/bin/goupdate|grep '$@'` ]];then
  170. cat > $HOME/go/bin/goupdate << 'EOF'
  171. #!/bin/zsh
  172. source <(curl -L https://go-install.netlify.app/install.sh) $@
  173. EOF
  174. chmod +x $HOME/go/bin/goupdate
  175. fi
  176. fi
  177. }
  178. main(){
  179. sys_arch
  180. check_network
  181. install_go
  182. setup_env
  183. setup_proxy
  184. install_updater
  185. echo -e "golang `color_echo $blue $install_version` 安装成功!"
  186. }
  187. main