Skip to content

1. 내장 변수(Builtin Variables)


내장(Builtin) 변수란 BASH 스크립트의 동작에 영향을 미치는 변수를 뜻하며, 다음과 같다.


변수 설명
$BASH BASH 실행 파일의 경로로, 보통은 /bin/bash
$BASH_ENV 스크립트가 실행될 때 어디에서 BASH 시작 파일을 읽을 것인지를 나타내는 환경 변수
$BASH_VERSINFO[n] 원소 개수가 6개인 배열로, 현재 설치된 BASH 버전에 대한 정보를 담고 있음
$BASH_VERSION 시스템에 설치된 BASH 버전
$DIRSTACK 디렉터리 스택의 내용으로 이 내장 변수는 dirs 명령어와 짝을 이룸
$EDITOR 스크립트가 부르는 에디터로서, 보통은 viemacs
$EUID 유효한 사용자 아이디 값
$FUNCNAME 현재 함수의 이름으로, 함수 밖에서는 널 값을 가짐
$GLOBIGNORE globbing 시 포함되지 않을 파일명 패턴들의 목록
$GROUPS 현재 사용자가 속해 있는 그룹으로 /etc/passwd에 적혀 있는 현재 사용자의 그룹 아이디 값을 보여줌
$HOME 사용자의 홈 디렉터리로, 보통은 /home/username
$HOSTNAME 부팅 시 Init 스크립트에서 시스템 이름을 설정해 줌
$HOSTTYPE 호스트 타입이며, $MACHTYPE과 마찬가지로 시스템 하드웨어를 알려줌
$IFS 입력 필드 구분자
$IGNOREEOF EOF 무시
$LC_COLLATE 파일명 확장이나 패턴 매칭 시의 대조 순서를 제어함
$LC_CTYPE globbing과 패터너 매칭의 문자 해석을 제어함
$LINENO 셸 스크립트에서 이 변수가 들어 있는 줄의 줄 번호를 나타냄
$MACHTYPE 시스템 하드웨어를 알려줌
$OLDPWD 바로 전 작업 디렉터리
$OSTYPE 운영체제 종류
$PATH 실행 파일의 경로로, 보통은 /usr/bin/, /usr/local/bin 등이 있음
$PIPESTATUS 마지막으로 실행된 파이프의 종료 상태
$PPID 부모 프로세스 아이디
$PS1 명령어줄에서 볼 수 있는 메인 프롬프트
$PS2 2차 프롬프트로, 추가적인 입력이 필요할 때 >로 표시됨
$PS3 3차 프롬프트로, select 루프문에서 표시됨
$PS4 4차 프롬프트로, 스크립트에 -x 옵션이 걸려서 실행될 때 스크립트의 매 줄마다 +로 표시됨
$PWD 현재 작업 디렉터리
$REPLY read에 변수가 안 주어졌을 때 저장되는 기본값이고, select 메뉴에서는 변수의 값이 아니라 선택한 숫자가 저장됨
$SECONDS 스크립트가 얼마나 돌았는지를 나타내는 초 단위 시간
$SHELLOPTS 현재 켜져 있는 셸 옵션들의 목록으로서 읽기 전용 변수
$SHLVL 셸 레벨로 BASH가 얼마나 깊이 중첩되어 있는지를 나타냄
$TMOUT 0이 아닌 값으로 설정해 놓으면 그 시간이 지난 다음에 로그아웃 됨
$UID 사용자 아이디 값


위치 매개변수(Positional Parameters)는 다음과 같다.


변수 설명
$0, $1, $2, ..., ${10} 위치 매개변수로서, 명령어줄에서 스크립트로 넘겨지거나 함수로 넘겨지거나 set 명령어로 강제로 설정됨
$# 명령어줄 인자의 개수나 위치 매개변수들
$* 한 낱말로 표시되는 모든 위치 매개변수들
$@ $*과 같지만 각 매개변수는 쿼우트된 문자열로 취급되며, 해석되거나 확장없이 있는 그대로 넘겨짐


다른 특수 매개변수는 다음과 같다.


변수 설명
$- 스크립트로 넘겨진 플래그들
$! 백라운드로 돌고 있는 가장 최근 작업의 PID
$_ 바로 이전에 실행된 명령어의 제일 마지막 인자로 설정되는 특수 변수
$? 명령어나 함수, 스크립트 자신의 종료 상태
$$ 스크립트 자신의 PID롤 보통 임시 파일 이름을 만들 때 사용


$*과 $@로 인자를 나열하기
#!/bin/bash

# 스크립트를 부를 때 "one two three"를 넣음

E_BADARGS=65

if [ ! -n "$1" ]; then
    echo "사용법: $(basename $0) argument1 argument2 etc."
    exit $E_BADARGS
fi

index=1

echo "\"\$*\"로 인자를 나열하기:"
# "$*"를 쿼우트하지 않으면 제대로 동작하지 않음
# $*는 모든 인자를 하나의 낱말로 봄
for arg in "$*"; do
    echo "Arg #$index = $arg"
    let "index += 1"
done
echo "전체 인자 목록은 하나의 낱말로 나타납니다."
# "$*"로 인자를 나열하기:
# Arg #1 = one two three
# 전체 인자 목록은 하나의 낱말로 나타납니다.

index=1

echo "\"\$@\"로 인자를 나열하기:"
# "$@"를 쿼우트하지 않으면 제대로 동작하지 않음
# $@는 인자들을 분리된 낱말로 봄
for arg in "$@"; do
    echo "Arg #$index = $arg"
    let "index += 1"
done
echo "전체 인자 목록은 분리된 낱말로 나타납니다."
# "$@"로 인자를 나열하기:
# Arg #1 = one
# Arg #2 = two
# Arg #3 = three
# 전체 인자 목록은 분리된 낱말로 나타납니다.

exit 0

References