Bash Parameters
man
이 문서에서 다루는 거의 모든 내용은 man bash의 PARAMETERS에서 읽어볼 수 있다.
스크립트/함수 인자
$0: 0번째 인자(스크립트나 명령의 이름).$1: 첫 번째 인자$2: 두 번째 인자$3: 세 번째 인자- …
$#:$0을 제외한 인자의 개수- 즉,
$1,$2,$3, …의 개수
- 즉,
단, 두 자리 이상의 숫자가 되면 중괄호로 씌워야 한다.
${10}: 열 번째 인자
다음 스크립트로 테스트해볼 수 있다.
#! /bin/bash
echo $10 ${10}
아래와 같이 호출해보면 a0 j가 출력된다.
$ ./test.sh a b c d e f g h i j k
a0 j
$*와 $@
모든 인자를 담아두는 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로 읽어들인 명령행을 단어로 분리할 때 사용된다. - 기본값
spacetabnewline.
- 확장 후에 단어들을 분리하거나, 빌트인 명령어인
$IFS는 그냥 출력하면 값을 알 수 없다. 내 macOS 컴퓨터에서 [[/cmd/xxd]]를 사용해서 값을 16진수로 출력해보았더니 다음과 같은 값이 나왔다.
$ echo "$IFS" | xxd
00000000: 2009 0a0a
20: Space09: TAB0a: LF
환경 변수
위에서 언급한 변수들은 bash에 의해 지정되는 셸 변수들이고, 환경 변수는 그 외의 다른 변수들을 말한다.
셸 스크립트를 작성할 때에는 같이 혼용하는 경우가 많아서 잘 알아두면 도움이 된다.
$EDITOR: 편집기. 보통은vi.$TERM: 사용자의 터미널 타입.- 나는
export TERM=xterm-256color으로 설정하고 사용한다.
- 나는
$USER: 사용자의 이름.