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

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

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

목차
  1. 함수 정의와 리턴
  2. 배열 조작
  3. getopts로 옵션 파싱
  4. trap으로 신호 처리
  5. 실전 패턴 모음
  6. heredoc으로 설정 파일 생성

함수 정의와 리턴

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)

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