Bash 개발
Bash 5.1+ 스크립트 개발을 위한 핵심 패턴과 모범 사례입니다. 현대적인 bash 관용구, 에러 처리, 인자 파싱, 외부 명령어 대신 순수 bash 대안을 제공합니다.
스크립트 기초
모든 스크립트는 다음 필수 헤더로 시작합니다:
#!/usr/bin/env bash
set -euo pipefail
set 옵션 설명:
-e- 명령어 실패 시 즉시 종료-u- 설정되지 않은 변수를 오류로 처리-o pipefail- 파이프라인에서 어떤 명령어라도 실패하면 파이프라인 실패 처리
스크립트 메타데이터 패턴
SCRIPT_NAME=$(basename "${BASH_SOURCE[0]}")
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
readonly SCRIPT_VERSION="1.0.0"
readonly SCRIPT_NAME SCRIPT_DIR
에러 처리
견고한 스크립트를 위한 trap 기반 에러 처리를 구현합니다.
인자 파싱
표준 인자 파싱 템플릿입니다.
변수 모범 사례
항상 중괄호를 사용하고 변수를 따옴표로 감쌉니다:
# 올바름
"${variable}"
"${array[@]}"
# 잘못됨
$variable
${array[*]} # 올바른 반복을 위해 [@] 사용
상수에는 readonly 사용:
readonly CONFIG_FILE="/etc/app/config"
readonly -a VALID_OPTIONS=("opt1" "opt2" "opt3")
참고: 소스 스크립트 안에서는 readonly를 사용하지 마십시오. 다시 소싱할 때 오류가 발생합니다.
문자열 연산 (순수 Bash)
외부 도구보다 네이티브 bash 매개변수 확장을 선호하십시오:
# 공백 제거
trimmed="${string#"${string%%[![:space:]]*}"}"
trimmed="${trimmed%"${trimmed##*[![:space:]]}"}"
# 소문자/대문자 (Bash 4+)
lower="${string,,}"
upper="${string^^}"
# 부분 문자열 추출
substring="${string:0:10}" # 처음 10자
suffix="${string: -5}" # 마지막 5자
# 패턴 치환
replaced="${string//old/new}" # 모두 치환
replaced="${string/old/new}" # 첫 번째만 치환
# 접두사/접미사 제거
no_prefix="${string#prefix}" # 최단 일치
no_prefix="${string##*/}" # 최장 일치 (basename)
no_suffix="${string%suffix}" # 최단 일치
no_suffix="${string%%/*}" # 최장 일치
배열 연산
# 선언
declare -a indexed_array=()
declare -A assoc_array=()
# nullglob을 사용한 안전한 반복
shopt -s nullglob
for file in *.txt; do
process "${file}"
done
shopt -u nullglob
# 배열 길이
length="${#array[@]}"
# 요소 추가
array+=("new_element")
# 인덱스로 반복
for i in "${!array[@]}"; do
printf '%d: %s\n' "${i}" "${array[i]}"
done
파일 연산
# 파일을 문자열로 읽기
content="$(<"${file}")"
# 파일을 배열로 읽기 (Bash 4+)
mapfile -t lines < "${file}"
# 파일 조건 확인
[[ -f "${file}" ]] # 일반 파일 존재
[[ -d "${dir}" ]] # 디렉토리 존재
[[ -r "${file}" ]] # 읽기 가능
[[ -w "${file}" ]] # 쓰기 가능
[[ -x "${file}" ]] # 실행 가능
[[ -s "${file}" ]] # 비어 있지 않음
# 안전한 임시 파일 생성
temp_file=$(mktemp)
trap 'rm -f "${temp_file}"' EXIT
조건 표현식
조건문에는 [[ ]] 사용 (bash 전용, 더 강력함):
# 문자열 비교
[[ "${var}" == "value" ]] # 동등
[[ "${var}" == pattern* ]] # 글로브 매칭
[[ "${var}" =~ ^regex$ ]] # 정규식 매칭
# 숫자 비교
(( num > 10 )) # 산술 비교
[[ "${num}" -gt 10 ]] # 전통적인 문법
# 복합 조건
[[ -f "${file}" && -r "${file}" ]]
[[ "${opt}" == "a" || "${opt}" == "b" ]]
유틸리티 함수
성능 지침
- 가능하면 외부 명령어보다 내장 명령어 사용
- 대용량 데이터셋은 루프 대신 배치 연산 사용
- 이식성과 제어를 위해
echo대신printf사용 - 빡빡한 루프에서 불필요한 서브쉘 피하기
- 문자열 비교 시
[ ]보다[[ ]]사용
추가 자료
참조 파일
상세 패턴 및 예제는 다음을 참조하십시오:
- bash_example_file.sh - 완전한 스크립트 템플릿
- bash_example_includes.bash - 재사용 가능한 유틸리티 함수
- bash-agent-notes.md - 컨텍스트 인식 리뷰 가이드
- pure-bash-bible-strings.md - 문자열 조작 패턴
- pure-bash-bible-arrays.md - 배열 연산
- pure-bash-bible-files.md - 파일 처리 패턴
- pure-bash-bible-variables.md - 매개변수 확장 참조