반응형
작성일: 2026년 7월 13일

 

 

Bash 에서 "$@" 의 의미

Bash 에서 "$@"스크립트 / 함수에 넘어온 모든 위치 인자 (positional parameters) 를 각각 별개의 quoted 인자로 확장 하는 특수 변수.

핵심 동작

./run.sh alpha "beta gamma" delta 로 호출하면:

참조 확장 결과 (인자 개수)
$@ alpha beta gamma delta4개 (스페이스로 재분할)
"$@" alpha beta gamma delta3개 (원본 유지)
$* alpha beta gamma delta4개 (같음)
"$*" alpha beta gamma delta1개 (하나로 합침, $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 없이 쓰면 공백 / 특수문자 있는 인자가 깨져 자주 버그의 원인이 됨.

+ Recent posts