#!/usr/bin/env bash # install_go # ---------- # Instala Go en Linux. Detecta arquitectura automáticamente (amd64/arm64/armv6l). # Descarga desde go.dev/dl, instala en /usr/local y configura PATH en el shell config. # # USO: # source install_go.sh # install_go [version] [--force] # # ARGUMENTOS: # version Versión de Go a instalar (default: 1.22.0) # --force Reinstala aunque Go ya esté instalado install_go() { local version="1.22.0" local force=false for arg in "$@"; do case "$arg" in --force) force=true ;; *) [[ "$arg" =~ ^[0-9] ]] && version="$arg" ;; esac done local go_os="linux" local go_arch # Detectar arquitectura local arch arch="$(uname -m)" case "$arch" in x86_64) go_arch="amd64" ;; aarch64|arm64) go_arch="arm64" ;; armv6l) go_arch="armv6l" ;; *) echo "install_go: arquitectura no soportada: ${arch}" >&2 return 1 ;; esac # Verificar si ya está instalado if command -v go &>/dev/null && [[ "$force" != true ]]; then local current_version current_version="$(go version | awk '{print $3}' | sed 's/go//')" echo "install_go: Go ya está instalado (versión: ${current_version}). Usa --force para reinstalar." return 0 fi local tarball="go${version}.${go_os}-${go_arch}.tar.gz" local url="https://go.dev/dl/${tarball}" local install_dir="/usr/local" echo "Instalando Go ${version} para ${go_os}-${go_arch}..." # Eliminar versión anterior si existe if command -v go &>/dev/null; then echo "Eliminando versión anterior..." sudo rm -rf "${install_dir}/go" fi # Descargar en directorio temporal local tmp_dir tmp_dir="$(mktemp -d)" echo "Descargando ${url}..." if ! curl -LO --output-dir "$tmp_dir" "$url"; then echo "install_go: error al descargar Go ${version}. Verifica la versión en: https://go.dev/dl/" >&2 rm -rf "$tmp_dir" return 1 fi echo "Instalando en ${install_dir}..." sudo tar -C "$install_dir" -xzf "${tmp_dir}/${tarball}" rm -rf "$tmp_dir" # Configurar PATH en shell config local shell_config="" if [[ -f "$HOME/.bashrc" ]]; then shell_config="$HOME/.bashrc" elif [[ -f "$HOME/.zshrc" ]]; then shell_config="$HOME/.zshrc" fi if [[ -n "$shell_config" ]]; then if ! grep -q "export PATH=\$PATH:${install_dir}/go/bin" "$shell_config"; then { echo "" echo "# Go configuration" echo "export PATH=\$PATH:${install_dir}/go/bin" echo "export GOPATH=\$HOME/go" echo "export PATH=\$PATH:\$GOPATH/bin" } >> "$shell_config" echo "Variables de PATH añadidas a ${shell_config}" else echo "Variables de entorno ya configuradas en ${shell_config}" fi fi # Crear estructura GOPATH mkdir -p "$HOME/go"/{bin,src,pkg} # Verificar instalación export PATH="$PATH:${install_dir}/go/bin" local installed_version installed_version="$("${install_dir}/go/bin/go" version)" echo "" echo "Go instalado correctamente: ${installed_version}" echo "Reinicia tu terminal o ejecuta: source ${shell_config:-~/.bashrc}" } # Ejecutar si se invoca directamente if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then install_go "$@" fi