go 언어 설치 스크립트

#!/usr/bin/env bash
# ------------------------------------------------------------------
# go 언어 개발환경 구축 스크립트
# ------------------------------------------------------------------

# 스크립트 오류 발생 시 즉시 중단
set -euo pipefail

# 1. 색상 정의 (출력용)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_err()  { echo -e "${RED}[ERROR]${NC} $1"; }

# ------------------------------------------------------------------
# [신규 추가] 필수 명령어 존재 여부 검사 루틴
# ------------------------------------------------------------------
check_required_commands() {
    local missing_cmds=()
    # 스크립트 동작 및 기본 다운로드/해제에 필수적인 도구들
    local required_cmds=("curl" "tar" "uname" "grep" "cat")

    for cmd in "${required_cmds[@]}"; do
        if ! command -v "$cmd" &> /dev/null; then
            missing_cmds+=("$cmd")
        fi
    done

    if [ ${#missing_cmds[@]} -ne 0 ]; then
        log_err "스크립트 실행에 필요한 필수 명령어가 시스템에 없습니다."
        log_err "누락된 명령어: ${missing_cmds[*]}"
        log_err "해당 도구들을 먼저 설치한 후 다시 실행해 주세요."
        exit 1
    fi
}

# 필수 명령어 검사 실행
check_required_commands
# ------------------------------------------------------------------

# 2. 루트/sudo 권한 확인
if [ "$EUID" -ne 0 ]; then
    log_err "이 스크립트는 root 권한 또는 sudo로 실행해야 합니다."
    exit 1
fi

# 실제 사용자 계정 탐색 (sudo 실행 시 원본 사용자 파악)
SUDO_USER_NAME="${SUDO_USER:-$USER}"
USER_HOME=$(eval echo "~$SUDO_USER_NAME")

# 3. OS 패키지 관리자 감지 및 빌드 필수 패키지 설치
log_info "OS 및 패키지 관리자 확인 중..."

if command -v apt-get &> /dev/null; then
    log_info "Debian/Ubuntu 계열이 감지되었습니다. 패키지를 업데이트합니다..."
    apt-get update -y
    apt-get install -y curl tar git build-essential
elif command -v dnf &> /dev/null; then
    log_info "Rocky Linux / RHEL 계열이 감지되었습니다. 패키지를 업데이트합니다..."
    dnf install -y curl tar git gcc make
else
    log_err "지원되지 않는 OS 환경입니다. (apt-get 또는 dnf 패키지 관리자가 필요합니다)"
    exit 1
fi

# 4. 최신 Go 버전 정보 가져오기
log_info "Go 언어 최신 버전을 확인하고 있습니다..."
LATEST_GO_VERSION=$(curl -s https://go.dev/VERSION?m=text | head -n 1)

if [ -z "$LATEST_GO_VERSION" ]; then
    log_warn "최신 버전을 가져오지 못했습니다. 기본 버전을 사용합니다 (go1.22.5)."
    LATEST_GO_VERSION="go1.22.5"
fi

ARCH=$(uname -m)
case "$ARCH" in
    x86_64) GO_ARCH="amd64" ;;
    aarch64|arm64) GO_ARCH="arm64" ;;
    *) log_err "지원되지 않는 아키텍처입니다: $ARCH"; exit 1 ;;
esac

GO_TARBALL="${LATEST_GO_VERSION}.linux-${GO_ARCH}.tar.gz"
DOWNLOAD_URL="https://go.dev/dl/${GO_TARBALL}"

# 5. 기존 Go 설치 제거 및 바이너리 다운로드
log_info "기존 Go 설치(있을 경우)를 정리합니다 (/usr/local/go)..."
rm -rf /usr/local/go

log_info "${LATEST_GO_VERSION} (${GO_ARCH}) 다운로드 중: ${DOWNLOAD_URL}"
curl -sSL -O "$DOWNLOAD_URL"

log_info "/usr/local 에 Go 압축을 해제합니다..."
tar -C /usr/local -xzf "$GO_TARBALL"
rm -f "$GO_TARBALL"

# 6. 사용자 환경변수(.bashrc) 설정
SHELL_CONFIG="${USER_HOME}/.bashrc"

log_info "${SUDO_USER_NAME} 사용자의 ${SHELL_CONFIG} 에 환경변수를 설정합니다..."

# 이미 설정된 값이 있는지 확인 후 등록
if ! grep -q "export PATH=\x24PATH:/usr/local/go/bin" "$SHELL_CONFIG"; then
    cat << 'EOF' >> "$SHELL_CONFIG"

# Go Development Environment
export PATH=$PATH:/usr/local/go/bin
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
EOF
fi

# GOPATH 디렉터리 생성 및 권한 설정
chown -R "$SUDO_USER_NAME":"$SUDO_USER_NAME" /usr/local/go
su - "$SUDO_USER_NAME" -c "mkdir -p $USER_HOME/go/{src,pkg,bin}"

log_info "=========================================="
log_info " Go 개발환경 구축이 완료되었습니다! "
log_info "=========================================="
log_info "설치된 버전: $(/usr/local/go/bin/go version)"
log_info ""
log_warn "현재 터미널 섹션에 환경변수를 적용하려면 아래 명령어를 실행하세요:"
echo -e "${GREEN}source ~/.bashrc${NC}"
위로 스크롤