스크립트가 길어지면 같은 명령을 함수로 묶고 싶어집니다. 그런데 bash 함수는 다른 언어와 규칙이 묘하게 달라서, return으로 값을 돌려받으려다 막힙니다. 핵심은 인자는 $1로 받고, 진짜 반환값은 출력으로 내보낸다는 점입니다.
정의와 인자 전달
함수는 name() { ... } 형태로 정의합니다. 인자는 괄호가 아니라 호출할 때 공백으로 나열하고, 함수 안에서는 $1, $2 순으로 받습니다.
로컬 터미널
greet() {
echo "안녕하세요, $1님 ($2)"
}
greet 지훈 관리자
OUTPUT
안녕하세요, 지훈님 (관리자)
함수 안에서 쓰는 특수 변수는 인자를 다룰 때 핵심입니다.
| 변수 | 의미 |
|---|---|
$1 $2 | 첫째·둘째 인자 |
$@ | 인자 전체(개별 단어로) |
$# | 인자 개수 |
$0 | 스크립트 이름 |
$? | 직전 명령 종료코드 |
return은 값이 아니라 종료코드
가장 많이 하는 실수입니다. bash의 return은 0~255 종료 상태만 돌려줍니다. 실제 결과 문자열·숫자를 받으려면 echo로 출력하고 $(...)로 잡습니다.
로컬 터미널
add() {
echo $(( $1 + $2 )) # 결과는 출력으로
}
result=$(add 3 5) # 명령 치환으로 받기
echo "합계: $result"
is_root() {
[ "$(id -u)" -eq 0 ] # 성공/실패는 return으로
return $?
}
add는 계산 결과를 출력으로 내보내 변수에 담고, is_root는 성공·실패라는 참/거짓만 종료코드로 알립니다. 데이터는 출력, 성패는 종료코드 — 이 구분이 핵심입니다.
지역변수와 범위
bash 변수는 기본이 전역이라, 함수 안에서 만든 변수가 바깥을 오염시킵니다. local을 붙여 함수 안에 가두세요.
로컬 터미널
process() {
local count=0 # 이 함수 안에서만 유효
for f in "$@"; do
count=$((count + 1))
done
echo "$count개 처리"
}
"$@"를 큰따옴표로 감싸는 것도 중요합니다. 공백이 든 파일명도 한 인자로 안전하게 넘어갑니다.
요점 정리
- 인자는
$1·$@로 받고, 호출은 공백 나열로 한다. return은 종료코드(0~255), 데이터는echo+$(...)로 주고받는다.- 변수는
local로 함수 안에 가둬 전역 오염을 막는다. "$@"는 큰따옴표로 감싸 공백 인자를 보호한다.
bash 함수로 재사용 가능한 스크립트를 직접 짜보는 실습은 리눅스 트랙에서 회원가입 없이 무료로 익힐 수 있습니다.