쉘 스크립팅 · 6 min read · Dec 07, 2025

쉘 스크립팅 파트 V: Bash의 함수

안녕하세요! HowToForge의 쉘 스크립팅 튜토리얼 시리즈에 오신 것을 환영합니다. 이전 튜토리얼을 읽고 싶으시면 여기를 클릭하여 파트1, 파트2, 파트3 및 파트4를 확인하세요. 이 파트에서는 함수를 생성하여 스크립트를 효율적으로 구조화하는 방법을 배웁니다. 이 튜토리얼이 끝나면 Linux Bash Shell에서 함수를 생성하고, 함수에 매개변수를 전달하고, 함수에서 메인 코드로 값을 반환하는 방법을 알 수 있게 됩니다. 시작해봅시다!

소개

함수는 프로그래밍 언어에서 서브루틴으로도 알려져 있으며, 주 루틴을 위해 특정 작업을 수행하는 명령어 집합입니다 [1]. 이는 프로그래머가 복잡하고 긴 코드를 필요할 때마다 호출할 수 있는 작은 섹션으로 나눌 수 있게 해줍니다. 각 함수는 실행되기 위해 주 루틴에 의해 호출되어야 하므로, 코드의 다른 부분과 격리되어 코드 테스트를 쉽게 만듭니다. 또한, 함수는 언제든지 반복적으로 호출할 수 있어 코드를 재사용하고 최적화하며 최소화할 수 있습니다. 대부분의 프로그래밍 언어와 마찬가지로 bash 셸도 함수를 지원합니다.

일반 구문:

  1. 구문 1: function function_name { ##### 명령어 집합 }
  2. 구문 2: function_name() { #### 명령어 집합 }

함수 생성하기

bash는 함수에 대해 두 가지 구조를 지원합니다. 첫 번째 구문을 사용할 때는 키워드 function을 사용하고, 그 뒤에 함수 이름과 괄호 및 중괄호를 사용하여 함수의 내용을 주 루틴과 구분해야 합니다. PHP에 대한 배경이 있다면 이 구문이 익숙할 것입니다. PHP에서 함수는 같은 방식으로 선언됩니다. 다른 구문은 함수 이름, 괄호 및 중괄호로만 구성됩니다.

#!/bin/bash  
myfunction(){  
    echo "내 함수가 작동합니다!"  
}  
myfunction

쉘 스크립트에서 함수 생성하기

우리의 예제에서 두 번째 구문을 사용했습니다. myfunction 함수를 생성한 후, 주 루틴에 함수 이름을 호출하여 호출했습니다. 주 루틴은 함수의 일부로 정의되지 않은 스크립트의 어느 곳에나 있을 수 있습니다.

이제 코드를 재구성하여 함수가 스크립트의 어디에서든 선언될 수 있는지 테스트해 보겠습니다. 아래 코드를 고려하세요:

#!/bin/bash  
echo "내 함수를 테스트합니다"  
myfunction  
  
myfunction(){  
    echo "내 함수가 작동합니다!"  
}

bash에서 함수 생성하기

위 코드의 3번째 줄은 명령을 찾을 수 없다는 오류를 반환합니다. 이는 다음을 의미합니다:

함수는 주 루틴 전에 선언되어야만 작동합니다. 주 루틴 이후에 함수를 선언하면 인터프리터가 오류를 반환합니다.

함수를 사용한 코드 재구성

함수의 가장 좋은 기능 중 하나는 코드를 재사용할 수 있다는 것입니다. 절차가 반복적으로 명령을 실행해야 하지만 루프 문을 사용하여 구조화할 수 없는 경우 함수가 해결책이 될 수 있습니다.

예를 들어, 아래 코드를 고려하세요:

#!/bin/bash  
while(true)  
do  
    clear  
    printf "다음 작업 중에서 선택하세요: \n"  
    printf "[a]덧셈\n[b]뺄셈\n[c]곱셈\n[d]나눗셈\n"  
    printf "################################\n"  
    read -p "당신의 선택: " choice  
    case $choice in  
    [aA])  
        read -p "첫 번째 정수를 입력하세요: " int1  
        read -p "두 번째 정수를 입력하세요: " int2  
        res=$((int1+int2))  
   
    ;;  
    [bB])  
        read -p "첫 번째 정수를 입력하세요: " int1  
        read -p "두 번째 정수를 입력하세요: " int2  
    res=$((int1-int2))  
   
    ;;  
    [cC])  
        read -p "첫 번째 정수를 입력하세요: " int1  
        read -p "두 번째 정수를 입력하세요: " int2  
        res=$((int1*int2))  
   
    ;;  
    [dD])  
        read -p "첫 번째 정수를 입력하세요: " int1  
        read -p "두 번째 정수를 입력하세요: " int2  
        res=$((int1/int2))  
   
    ;;  
    *)  
        res=0  
        echo "잘못된 선택입니다!"  
    esac  
  
    echo "결과는: " $res  
    read -p "계속하시겠습니까? [y]예 또는 [n]아니오: " ans  
    if [ $ans == 'n' ]  
        then  
         echo "스크립트를 종료합니다. 좋은 하루 되세요!"  
        break  
    else  
        continue  
    fi  
  
done

bash의 switch 문

스크립트는 잘 실행되지만, 입력을 받는 줄이 스위치 문에서 각 패턴에 반복적으로 수행되는 것을 주목하세요.

#!/bin/bash  
inputs(){  
     read -p "첫 번째 정수를 입력하세요: " int1  
    read -p "두 번째 정수를 입력하세요: " int2  
}  
  
exitPrompt(){  
    read -p "계속하시겠습니까? [y]예 또는 [n]아니오: " ans  
    if [ $ans == 'n' ]  
    then  
        echo "스크립트를 종료합니다. 좋은 하루 되세요!"  
        break  
    else  
        continue  
    fi  
}  
  
while(true)  
do  
    clear  
    printf "다음 작업 중에서 선택하세요: \n"  
    printf "[a]덧셈\n[b]뺄셈\n[c]곱셈\n[d]나눗셈\n"  
    printf "################################\n"  
    read -p "당신의 선택: " choice  
  
    case $choice in  
    [aA])  
        inputs  
        res=$((int1+int2))  
    ;;  
  
    [bB])  
        inputs  
        res=$((int1-int2))  
    ;;  
  
    [cC])  
        inputs  
        res=$((int1*int2))  
    ;;  
  
    [dD])  
        inputs  
        res=$((int1/int2))  
    ;;  
  
    *)  
        res=0  
        echo "잘못된 선택입니다!"  
    esac  
  
    echo "결과는: " $res  
    exitPrompt  
done

bash의 case 문

우리는 inputs와 exitPrompt라는 하위 섹션을 생성하여 코드를 개선했습니다. 이는 이전 코드와 정확히 동일하게 작동하지만, 현재 코드는 구조가 잘 되어 있어 문제를 해결하기가 더 쉽습니다.

함수에 매개변수 전달하기

대부분의 프로그래밍 언어와 마찬가지로, bash에서도 매개변수를 전달하고 해당 데이터를 함수에서 처리할 수 있습니다. 아래 코드는 쉘 스크립팅에서 값을 전달하는 방법을 보여줍니다:

#!/bin/bash  
myfunction(){  
    echo $1  
    echo $2  
}  
  
myfunction "안녕하세요" "세계"

bash를 사용한 함수 간 값 전달

우리의 예제에서, myfunction을 호출한 후에 “안녕하세요“와 “세계”라는 값을 추가했습니다. 이 값들은 매개변수로 myfunction에 전달되어 로컬 변수에 저장됩니다. 그러나 다른 언어와 달리, 인터프리터는 전달된 값을 미리 정의된 변수에 저장하며, 이는 매개변수 전달 순서에 따라 이름이 지정됩니다. 1은 시작 이름이며 전달 순서에 따라 증가합니다. “안녕하세요“ 단어는 변수 1에 저장되고, 값 “세계”는 변수 2에 저장됩니다.

참고: 예제에서 1과 2는 로컬 변수이므로 매개변수가 전달되는 함수 외의 스크립트의 다른 부분에서는 접근할 수 없습니다.

예를 들어,

#!/bin/bash  
myfunction(){  
    echo $1  
    echo $2  
}  
  
myfunction "안녕하세요" "세계"  
echo $1  
echo $2

bash 스크립팅에서 매개변수 전달

스크립트의 마지막 두 줄에서 echo $1과 echo $2는 표시되지 않습니다. 이는 인터프리터가 두 변수를 인식하지 못하기 때문입니다. 두 변수 모두 myfunction에 로컬로 존재하기 때문입니다.

함수에서 값 반환하기

함수를 생성하고 매개변수를 전달하는 것 외에도, bash 함수는 return 키워드를 사용하여 함수의 로컬 변수 값을 주 루틴으로 전달할 수 있습니다. 반환된 값은 기본 변수 $?에 저장됩니다. 예를 들어, 다음 코드를 고려하세요:

#!/bin/bash  
add(){  
    sum=$(($1+$2))  
    return $sum  
}  
  
read -p "정수를 입력하세요: " int1  
read -p "정수를 입력하세요: " int2  
add $int1 $int2  
echo "결과는: " $?

bash에서 함수로부터 값 반환하기

예제에서 우리는 int1과 int2 매개변수를 add 함수에 전달합니다. 다음으로 add 함수는 sum=$(($1+$2)) 줄을 통해 이를 처리합니다. 그런 다음 sum 변수의 값은 return $sum 줄을 통해 주 루틴으로 전달됩니다. 기본적으로 $sum의 값은 기본 변수 $?에 저장됩니다. 마지막으로 echo “결과는: “ $? 줄은 결과를 출력합니다.

참고: 쉘 스크립트는 단일 값만 반환할 수 있습니다.

다른 프로그래밍 언어와 달리, 쉘 스크립트는 함수에서 여러 값을 반환할 수 없습니다. 다음 예제를 살펴보겠습니다:

#!/bin/bash  
add(){  
    sum=$(($1+$2))  
    dif=$(($1-$2))  
    return $sum   
}  
  
read -p "정수를 입력하세요: " int1  
read -p "정수를 입력하세요: " int2  
add $int1 $int2  
echo "결과는: " $?  
echo "결과는: " $?

bash 함수에서 반환 값

요약

함수를 사용하고 매개변수를 전달하며 값을 반환하는 또 다른 예제를 살펴보겠습니다.

#!/bin/bash  
#####################  
#작성자: HowtoForge #  
#####################  
   
clear(){  
    clear  
}  
  
bin(){  
    bin1=$(echo "obase=2;$1"|bc)  
    echo $bin1  
}  
  
dec(){  
    dec1=$(echo "ibase=2;$1"|bc)  
    return $dec1  
}  
  
########메인#########  
    printf "다음 작업 중에서 선택하세요:\n[1]십진수에서 이진수로 변환\n"  
    printf "[2]이진수에서 십진수로 변환\n"  
    read -p "당신의 선택: " op  
    case $op in  
  
    1)  
        read -p "정수 번호를 입력하세요: " int  
        bin $int  
    ;;  
  
    2)  
        read -p "이진수를 입력하세요: " int  
        dec $int  
        echo "$int의 십진수는 $?입니다."  
    ;;  
  
    *)  
        echo "잘못된 선택입니다!"  
    esac

bash에서 이진수에서 십진수로 변환

bash에서 십진수에서 이진수로 변환

주어진 예제는 주어진 입력을 이진수 또는 십진수 값으로 변환합니다. $(echo “obase=2;$1”|bc) 줄은 주어진 십진수 값을 이진수로 변환하고 bin1 변수에 저장합니다. 다음으로 echo 명령을 사용하여 $bin1의 값을 표시합니다.

참고: 십진수에서 이진수로 변환할 때는 직접 echo를 사용하는 것이 좋습니다. 이진수 값을 반환하기 위해 명령을 반환할 때, bash는 이진수 값을 반환하기 전에 십진수로 변환합니다.

또한, $(echo “ibase=2;$1”|bc) 명령을 사용하여 이진 값을 십진수로 변환했습니다.

인터프리터는 8비트 이진수만 수용할 수 있다는 점도 기억해야 합니다. 8비트 한계를 초과하는 숫자를 입력하면 오버플로우가 발생하고 숫자의 가장 중요한 비트가 버려집니다.

10비트 이진수 1000001010은 10을 반환합니다. 8비트 규칙에 따라 오른쪽(가장 중요한 비트)의 나머지 2비트가 생략되므로, 1000001010은 00001010과 같아지고 이는 10과 같습니다. 8비트를 초과하는 이진수를 수용하는 작업을 원한다면 코드를 수동으로 작성해야 합니다.

결론

Bash는 사용자에게 여러 도구를 제공하고 Linux 시스템을 더욱 강력하게 만들기 위해 프로그래밍 언어와 매우 유사한 기능을 가지고 있습니다. 이 시리즈에서 여러분은 함수를 통해 쉘 스크립팅에 대한 지식을 향상시켰습니다. 쉘 스크립트의 함수는 사용자에게 모듈성을 제공하여 스크립트를 더 쉽게 문제를 해결하고 코드 재사용을 가능하게 합니다.

참고:

[1] American Heritage® Dictionary of the English Language, Fifth Edition. Copyright © 2011 by Houghton Mifflin Harcourt Publishing Company. Published by Houghton Mifflin Harcourt Publishing Company.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.