POSIX Shell: 변수(Variables) & 문자열(String)

쉘 스크립트에서 변수는 별도의 선언(형식 지정) 없이 바로 사용할 수 있어 유연하지만, 그만큼 문법이 엄격한 부분도 있습니다.

특히 공백따옴표 사용법이 핵심입니다.

변수 선언과 사용 (Variables)

Shell 변수는 선언 시 타입을 지정하지 않으며, 공백에 매우 민감합니다.

# 선언: = 앞뒤 공백 금지 (필수!)
NAME="lycos7560" 
COUNT=42 

# 사용: $ 또는 ${}를 사용
echo "$NAME"       # 일반적인 사용
echo "${NAME}"     # 경계를 명확히 할 때 권장
echo "User_${NAME}_log" # 변수명 뒤에 문자가 붙을 때 필수
  • ⚠️ 주의: NAME = value처럼 공백을 넣으면 시스템은 NAME을 변수가 아닌 명령어로 인식하여 에러(command not found)를 발생시킵니다

특수 변수 (Special Variables)

스크립트 실행 시 자동으로 할당되는 예약 변수들입니다.

변수의미예시 (./run.sh aix hacmp)
$0스크립트 이름./run.sh
$1 ~ $9위치 매개변수 (인자)$1aix, $2hacmp
$#인자 개수2
$@모든 인자 (각각 분리)"aix" "hacmp"
$?마지막 명령어 종료 코드0(성공) 또는 1~255(실패)
$$현재 프로세스 PID1234

기본값 처리 (Default Values)

변수가 비어있을 때를 대비한 방어적 코딩 기법입니다.

  • ${VAR:-default}: VAR이 비어있으면 default를 사용 (변수 값은 유지)
  • ${VAR:=default}: VAR이 비어있으면 default변수에 대입
  • ${VAR:?message}: VAR이 비어있으면 메시지 출력 후 스크립트 종료
# 예시
HOST=""
printf "Connecting to %s...\n" "${HOST:-localhost}"  # localhost 출력

패턴 제거 (Pattern Removal)

파일 경로에서 파일명만 추출하거나 확장자를 뗄 때 가장 많이 사용하는 강력한 기능입니다.

문법설명기억법
${VAR#패턴}앞에서부터 최단 일치 제거#은 키보드 왼쪽(앞), 하나는 짧게
${VAR##패턴}앞에서부터 최장 일치 제거##은 길게
${VAR%패턴}뒤에서부터 최단 일치 제거%는 키보드 오른쪽(뒤), 하나는 짧게
${VAR%%패턴}뒤에서부터 최장 일치 제거%%는 길게
FILE="/var/log/syslog.tar.gz"

echo "${FILE##*/}"  # syslog.tar.gz (경로 제거)
echo "${FILE%.*}"   # /var/log/syslog.tar (최종 확장자 제거)
echo "${FILE%%.*}"  # /var/log/syslog (모든 확장자 제거)
echo "${FILE%/*}"   # /var/log (디렉토리만 추출)

[결과]
$ ./01_hello.sh start
syslog.tar.gz
/var/log/syslog.tar
/var/log/syslog
/var/log

문자열 치환 및 대소문자 변환 (Bash 확장)

주의: 아래 기능들은 Bash 4.0 이상에서 지원됩니다.

구형 AIX의 /bin/sh에서는 작동하지 않을 수 있으니 환경을 확인하세요.

문자열 치환

  • ${STR/old/new}: 첫 번째 일치 항목만 치환
  • ${STR//old/new}: 모든 일치 항목 치환

대소문자 변환

  • ${STR^^}: 전체 대문자
  • ${STR,,}: 전체 소문자

문자열 분리 (IFS 활용)

IFS(Internal Field Separator)는 쉘이 단어를 나누는 기준 문자입니다.

이를 변경하여 CSV 형태의 데이터를 쉽게 분리할 수 있습니다.

# 콜론(:)으로 구분된 데이터 파싱
LINE="hostname:192.168.1.1:8080"
IFS=":" read -r HOST IP PORT << EOF
$LINE
EOF

printf "Host: %s, IP: %s, Port: %s\n" "$HOST" "$IP" "$PORT"

POSIX 표준 변수 처리(${#}, ${%})는 매우 빠르고 효율적입니다.

sedawk 같은 외부 명령어를 호출하지 않고도 쉘 자체 기능만으로 문자열을 처리하는 습관을 들이면 스크립트의 성능이 비약적으로 향상됩니다!

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤