/엔지니어/Linux / Shell/Bash 고급 스크립트 — 함수·배열·getopts
Linux / Shell중급UbuntuDebianCentOSmacOSbashshell스크립트

Bash 고급 스크립트 — 함수·배열·getopts·trap

함수 정의·리턴값, 배열 조작, getopts로 옵션 파싱, trap으로 신호 처리까지 현업 자동화 스크립트 패턴을 정리합니다.

함수 정의와 리턴

Bash
# 기본 함수
greet() {
  local name="$1"          # local로 스코프 제한
  echo "Hello, $name"
}
greet "World"

# 리턴값 (exit code 방식)
is_root() {
  [[ $EUID -eq 0 ]]        # 0이면 true, 1이면 false
}
if is_root; then echo "root입니다"; fi

# stdout으로 값 반환
get_date() {
  date +%Y%m%d
}
TODAY=$(get_date)
echo "$TODAY"

배열 조작

Bash
# 선언과 접근
fruits=("apple" "banana" "cherry")
echo "${fruits[0]}"          # apple
echo "${fruits[@]}"          # 전체
echo "${#fruits[@]}"         # 길이: 3

# 추가·삭제
fruits+=("grape")
unset fruits[1]              # banana 삭제

# 순회
for fruit in "${fruits[@]}"; do
  echo "$fruit"
done

# 연관 배열 (Bash 4+)
declare -A config
config[host]="localhost"
config[port]="5432"
echo "${config[host]}:${config[port]}"

getopts로 옵션 파싱

Bash
#!/usr/bin/env bash
usage() {
  echo "Usage: $0 [-h] [-n NAME] [-v]"
  exit 1
}

VERBOSE=false
NAME=""

while getopts ":hn:v" opt; do
  case $opt in
    h) usage ;;
    n) NAME="$OPTARG" ;;
    v) VERBOSE=true ;;
    :) echo "Option -$OPTARG requires an argument"; exit 1 ;;
    ?) echo "Unknown option: -$OPTARG"; exit 1 ;;
  esac
done
shift $((OPTIND - 1))       # 남은 positional args

echo "Name: $NAME, Verbose: $VERBOSE"
echo "Remaining args: $*"

trap으로 신호 처리

Bash
# 임시 파일 정리 패턴
TMPFILE=$(mktemp)
trap 'rm -f "$TMPFILE"; echo "Cleaned up"; exit' EXIT INT TERM

# 작업 수행
echo "data" > "$TMPFILE"
sleep 10      # Ctrl+C 눌러도 TMPFILE 자동 삭제됨

# 디버그 트레이스
trap 'echo "Line $LINENO: $BASH_COMMAND"' DEBUG

실전 패턴 모음

Bash
# 엄격 모드 (항상 권장)
set -euo pipefail

# 색상 출력
RED='\033[0;31m'; GREEN='\033[0;32m'; NC='\033[0m'
echo -e "${GREEN}OK${NC} 작업 완료"
echo -e "${RED}ERROR${NC} 실패"

# 재시도 함수
retry() {
  local n=0; local max=3; local delay=5
  until "$@"; do
    n=$((n+1))
    [[ $n -ge $max ]] && { echo "Failed after $max attempts"; return 1; }
    echo "Retry $n/$max in ${delay}s..."; sleep $delay
  done
}
retry curl -sf https://example.com

# 로그 함수
log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a /var/log/myscript.log
}
log "Started"

heredoc으로 설정 파일 생성

Bash
cat > /etc/myapp/config.conf << EOF
host=${DB_HOST:-localhost}
port=${DB_PORT:-5432}
user=${DB_USER:-app}
EOF

# 변수 치환 없이 그대로 쓰려면
cat > script.sh << 'EOF'
echo "$PATH"   # 그대로 출력됨 (치환 안 함)
EOF
#bash#shell#스크립트#자동화#함수
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

관련 공식 문서GNU/Linux man 페이지

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.