Bash Parameters
man
이 문서에서 다루는 거의 모든 내용은 man bash
의 PARAMETERS
에서 읽어볼 수 있다.
스크립트/함수 인자
$0
: 0번째 인자(스크립트나 명령의 이름).$1
: 첫 번째 인자$2
: 두 번째 인자$3
: 세 번째 인자- …
$#
:$0
을 제외한 인자의 개수- 즉,
$1
,$2
,$3
, …의 개수
- 즉,
$*
와 $@
모든 인자를 담아두는 parameter도 있다.
$*
: 모든 명령행 인자를 하나의 문자열로 합쳐둔 것. 이 때, 구분자는$IFS
이다.- 즉,
"$1 $2 $3 ..."
과 같다.
- 즉,
$@
:$*
와 비슷하지만 각 인자를 별도의 문자열로 취급한다.- 즉,
"$1" "$2" "$3" ...
과 같다. $*
는 인자들을 하나의 문자열로 취급하지만,$@
는 각각의 인자를 따로 취급한다.
- 즉,
이 두 변수는 꽤나 헷갈리는데, ""
를 사용할 때에만 다르다는 점만 기억해두면 충분하다.
즉, $*
와 $@
는 똑같이 작동하지만 "$*"
와 "$@"
는 다르게 작동한다.
예를 들어 다음과 같은 셸 스크립트가 있다고 하자.
#!/usr/bin/env bash
echo "쌍따옴표와 for를 사용해 \$* 를 출력합니다."
for arg in "$*"; do
echo "$arg"
done
echo ''
echo "쌍따옴표 없이 for를 사용해 \$* 를 출력합니다."
for arg in $*; do
echo "$arg"
done
echo ''
echo "쌍따옴표와 for를 사용해 \$@를 출력합니다."
for arg in "$@"; do
echo "$arg"
done
echo ''
echo "쌍따옴표 없이 for를 사용해 \$@를 출력합니다."
for arg in $@; do
echo "$arg"
done
이 셸 스크립트에 스페이스를 포함하는 인자를 넘겨주는 테스트를 해보면 다음과 같은 결과를 볼 수 있다.
# 인자는 3개
./test.sh "hello world" "nice to meet you" "I'm fine"
쌍따옴표와 for를 사용해 $* 를 출력합니다.
Hello World Nice to meet you
쌍따옴표 없이 for를 사용해 $* 를 출력합니다.
Hello
World
Nice
to
meet
you
쌍따옴표와 for를 사용해 $@를 출력합니다.
Hello World
Nice to meet you
쌍따옴표 없이 for를 사용해 $@를 출력합니다.
Hello
World
Nice
to
meet
you
최근에 실행한 명령 관련
$!
: 최근에 실행한 background 명령의 PID.$?
: 최근 실행한 foreground 파이프라인 명령의 종료 상태(exit status).0
: 성공- 0 초과: 실패
$_
: 최근 실행한 명령의 마지막 인자.
$ echo 1 2 3
1 2 3
$ echo $_
3
BASH 관련
$SHELL
: 현재 실행중인 셸의 경로.$BASH
: 현재 실행중인 bash의 경로.$BASH_VERSION
: 현재 실행중인 bash의 버전.$BASH_SUBSHELL
: 0부터 시작하는 서브셸 깊이 카운터.
$ echo $BASH_SUBSHELL
0
$ (echo $BASH_SUBSHELL)
1
$ (echo $BASH_SUBSHELL; (echo $BASH_SUBSHELL))
1
2
프롬프트 관련
$PS1
: 프롬프트 문자열.$PS2
: 프롬프트 문자열이 두 줄 이상일 때의 문자열.- default 값은
>
.
- default 값은
$PS3
:select
명령에서 사용하는 프롬프트 문자열.$PS4
:set -x
명령에서 사용하는 프롬프트 문자열.$PROMPT_COMMAND
: 프롬프트가 출력되기 전에 실행되는 명령을 지정할 수 있다.
현재 작업 셸 관련
$$
: 현재 셸의 프로세스 ID.$PPID
: 현재 셸의 부모 프로세스 ID.$HOME
: 현재 사용자의 홈 디렉토리.$PWD
: 현재 작업 디렉토리.cd
명령을 사용하면 변경된다.
$OLDPWD
: 이전 작업 디렉토리.$OLD_PWD
를 쓰는 경우도 있다. 사용하는 컴퓨터에서man bash
로 확인할 것.
$PIPESTATUS
: 파이프라인 명령의 종료 상태(exit status)를 [[/cmd/bash/arrays]]{배열}로 저장한다.${PIPESTATUS[0]}
: 첫 번째 명령의 종료 상태${PIPESTATUS[1]}
: 두 번째 명령의 종료 상태- …
${PIPESTATUS[@]}
: 모든 명령의 종료 상태- 자세한 예제는 [[/cmd/bash/pipe#pipestatus]] 문서를 참고할 것.
$PATH
: 명령을 찾는 경로.:
을 구분자로 사용한다.
명령 히스토리 관련
$HISTFILE
: 명령 히스토리를 저장하는 파일의 이름.- default 값은
~/.bash_history
.
- default 값은
$HISTFILESIZE
: 명령 히스토리 파일에 저장할 최대 라인 수.- default 값은
500
.
- default 값은
그 외
$LANG
: 화면에 표시할 언어 문자셋과 형식.- 나는
LANG="en_US.UTF-8"
으로 설정해서 사용하고 있다.
- 나는
$RANDOM
:0
~32767
사이의 랜덤한 정수.$IFS
: 내부 필드 구분자.- 확장 후에 단어들을 분리하거나, 빌트인 명령어인
read
로 읽어들인 명령행을 단어로 분리할 때 사용된다. - 기본값
space
tab
newline
.
- 확장 후에 단어들을 분리하거나, 빌트인 명령어인
$IFS
는 그냥 출력하면 값을 알 수 없다. 내 macOS 컴퓨터에서 [[/cmd/xxd]]를 사용해서 값을 16진수로 출력해보았더니 다음과 같은 값이 나왔다.
$ echo "$IFS" | xxd
00000000: 2009 0a0a
20
: Space09
: TAB0a
: LF
환경 변수
위에서 언급한 변수들은 bash에 의해 지정되는 셸 변수들이고, 환경 변수는 그 외의 다른 변수들을 말한다.
셸 스크립트를 작성할 때에는 같이 혼용하는 경우가 많아서 잘 알아두면 도움이 된다.
$EDITOR
: 편집기. 보통은vi
.$TERM
: 사용자의 터미널 타입.- 나는
export TERM=xterm-256color
으로 설정하고 사용한다.
- 나는
$USER
: 사용자의 이름.