반응형
작성일: 2026년 7월 13일
Bash 에서 "$@" 의 의미
Bash 에서 "$@" 는 스크립트 / 함수에 넘어온 모든 위치 인자 (positional parameters) 를 각각 별개의 quoted 인자로 확장 하는 특수 변수.
핵심 동작
./run.sh alpha "beta gamma" delta 로 호출하면:
| 참조 | 확장 결과 (인자 개수) |
|---|---|
$@ |
alpha beta gamma delta — 4개 (스페이스로 재분할) |
"$@" |
alpha beta gamma delta — 3개 (원본 유지) |
$* |
alpha beta gamma delta — 4개 (같음) |
"$*" |
alpha beta gamma delta — 1개 (하나로 합침, $IFS 로 조인) |
즉 quote 유무 + @ vs * 의 4 가지 조합 이 서로 다르게 동작.
왜 "$@" 만 쓰는 게 관용인가
공백 · 특수문자 포함 인자를 원본 그대로 다음 명령에 넘길 때 안전.
$ cat run.sh
#!/bin/bash
target-cmd "$@" # 정답: 각 인자 원본 보존
$ ./run.sh "a b" "c d"
# 내부에서는 target-cmd "a b" "c d" ← 2개 인자
$@ (quote 없이) 는 이렇게 됨:
target-cmd $@ # 함정
# → target-cmd a b c d ← 4개 인자로 재분할됨!
"$*" 는 이렇게:
target-cmd "$*" # 인자 1개로 합쳐짐
# → target-cmd "a b c d" ← 1개 인자
자주 쓰는 패턴
Wrapper 스크립트 (모든 인자 그대로 전달)
#!/bin/bash
exec /usr/bin/real-tool --my-flag "$@"
인자 loop
for arg in "$@"; do
echo "받은 인자: $arg"
done
인자를 array 로 보관
args=( "$@" )
target-cmd "${args[@]}" "--extra"
함수 내부
myfunc() {
echo "함수에 넘어온 것: $#개"
another-cmd "$@" # 함수 인자를 그대로 재전달
}
myfunc "hello world" "foo bar"
$@ 계열 변수 요약
| 변수 | 의미 |
|---|---|
$0 |
스크립트 이름 (bash 자체) |
$1, $2, … $9, ${10} … |
개별 위치 인자 |
$# |
위치 인자 개수 |
$@ / "$@" |
모든 인자 (개별) |
$* / "$*" |
모든 인자 (하나 vs 나눔) |
$$ |
현재 shell PID |
$! |
마지막 background 프로세스 PID |
$? |
마지막 명령의 exit status |
기억할 규칙 한 줄
"인자를 다음 명령에 그대로 넘길 때는 항상 "$@" (쌍따옴표 필수)".
$@ 을 quote 없이 쓰면 공백 / 특수문자 있는 인자가 깨져 자주 버그의 원인이 됨.
'Shell Script' 카테고리의 다른 글
| IO 성능(부하) 테스트를 위한 Shell Script (0) | 2024.08.14 |
|---|---|
| Bash Shell 기본 정리, 요약, 스크립트 예제 (Script example) (0) | 2023.02.15 |
| find xargs 명령 사용법 (편하게 사용하는 팁) (0) | 2022.07.05 |
| 카운트 다운 쉘 스크립트 (bash shell script - count down) (0) | 2022.07.05 |
| sed 사용법 - 종합 (0) | 2022.06.16 |
