← 아티클 목록

bash 함수 작성 — 인자·반환값·지역변수 제대로 다루기

2028-11-06#linux#bash#셸스크립트

스크립트가 길어지면 같은 명령을 함수로 묶고 싶어집니다. 그런데 bash 함수는 다른 언어와 규칙이 묘하게 달라서, return으로 값을 돌려받으려다 막힙니다. 핵심은 인자는 $1로 받고, 진짜 반환값은 출력으로 내보낸다는 점입니다.

정의와 인자 전달

함수는 name() { ... } 형태로 정의합니다. 인자는 괄호가 아니라 호출할 때 공백으로 나열하고, 함수 안에서는 $1, $2 순으로 받습니다.

로컬 터미널
greet() {
  echo "안녕하세요, $1님 ($2)"
}

greet 지훈 관리자
OUTPUT
안녕하세요, 지훈님 (관리자)

함수 안에서 쓰는 특수 변수는 인자를 다룰 때 핵심입니다.

변수의미
$1 $2첫째·둘째 인자
$@인자 전체(개별 단어로)
$#인자 개수
$0스크립트 이름
$?직전 명령 종료코드

return은 값이 아니라 종료코드

가장 많이 하는 실수입니다. bash의 return0~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 함수로 재사용 가능한 스크립트를 직접 짜보는 실습은 리눅스 트랙에서 회원가입 없이 무료로 익힐 수 있습니다.