본문 바로가기
프로그래밍 언어/Shell script(BASH)

[Shell Script] 함수 만들기

by Physics 2021. 6. 8.
728x90

BASH 쉘에서는 함수를 일종의 미니 스크립트처럼 다룬다. 따라서 BASH 쉘의 함수는 쉘 스크립트와 구조와 작동하는 방식이 비슷하다. 이러한 BASH 쉘에서 함수를 만들 수 있는 방식은 크게 두 가지 형태로 나뉜다.

1. 첫번째 형식: 키워드 함수 

1) 코드 블록에 함수 이름을 지정하는 키워드 함수 
2) syntax 

function name {
	commands
}

 - name: 함수에 지정할 고유 이름을 지정 
 - commands: 함수를 구성하는 하나 이상의 BASH 쉘 명령어 

2. 두번째 형식

name() {
	commands
}

- 다른 프로그래밍 언어에서 함수를 정의하는 방식과 유사함
- name 뒤의 빈 괄호는 함수를 정의하는 것 

3. Shell script에서 함수를 사용할 때 주의할 점 

1) 함수를 사용하기 전에 함수가 정의되어 있어야 함 
2) 함수를 다시 정의하게 되면 이전에 만들어진 함수의 정의를 덮어쓰게 됨
  - Shell script 상에서는 아무런 오류 메시지 없이 원래 함수의 정의를 덮어씌우므로 주의 


Shell 함수의 값 되돌려 주기 

Bash 쉘에서 함수는 종료 상태를 리턴한다. 이러한 종료상태를 만들 수 있는 방법은 3가지가 있다. 

1. 기본 종료 상태 

기본적으로 함수의 종료상태함수의 마지막 명령의 종료상태를 되돌려 준다. 

 

2. return 명령어 사용 

1) return 함수를 사용하여 함수의 종료상태를 정의하는 단일 정수값을 지정할 수 있다. 
2) return을 사용 시 주의해야 할 점 
   - return으로 종료상태를 리턴하는 경우, 해당 값은 0~255의 정수 범위 안에 있어야 함 
   - 따라서, 리턴하는 값이 255보다 크거나 임의의 실수 혹은 문자열을 리턴하는 경우에는 다른 방식을 사용해야 한다. 

$ vim function1.sh
#! /bin/bash
function TEST {
   read -p "Enter a value: " value
   echo "doubling the value"
   return $[ $value * 2 ]
}
TEST
echo "The new value is $?"

$ . function1.sh
Enter a value: 1
doubling the value
The new value is 2

$ . function1.sh
Enter a value: 200
doubling the value
The new value is 144

위의 예를 보면, 값을 2로 리턴하는 경우에는 정상적으로 값을 반환하지만, 반환해야 할 값(200*2)이 255를 넘어버리면 다른 값을 리턴함을 볼 수 있다. 

3. 함수의 출력 이용하기 

- 이 방법은 함수의 출력을 쉘 변수에 저장하여 사용한다.
- 임의의 실수(부동소수점) 혹은 문자열도 모두 사용할 수 있다. 

$ vim function2.sh 
#! /bin/bash
function TEST {
   read -p "Enter a value: " value
   echo $[ $value * 2 ]
}
result=$(TEST)
echo "The new value is $result"

$ . function2.sh
Enter a value: 200
The new value is 400

- 주의: echo 명령어를 이용해서 값을 반환하는 경우, 함수 내에서 사용한 모든 echo 문을 STDOUT 출력문으로 인식하여 값을 저장한다. 따라서 이 방법을 사용하는 경우에는 마지막 return 값에만 echo를 쓰도록 하자. 


Shell Script에서 매개변수 사용하기 

BASH 쉘은 함수를 미니 스크립트처럼 사용하기 때문에, 함수의 매개변수를 사용하는 방법이 기존의 쉘 스크립트에서 매개변수를 사용하는 방법과 동일하다. 

1. 함수의 매개 변수 (또는 쉘 스크립트의 매개변수) 
 
• $0 : 함수의 이름 
  • $1~$9 : 함수의 매개 변수들 
  • $# : 함수에 전달된 매개변수들의 갯수 

2. 매개 변수를 포함한 함수의 사용할 때는 함수와 같은 커맨드 라인에 매개변수를 제공한다. (아래의 예제 참고) 

$ vim function3.sh
#! /bin/bash
function addem {
    if [ $# -eq 0 ] || [ $# -gt 2 ]; then
        echo -1
    elif [ $# -eq 1 ]; then
        echo $[ $1 + $1 ]
    else
        echo $[ $1 + $2 ]
    fi
}
echo "Adding 10 and 15: $(addem 10 15)"
echo "Adding 1 and 1 : $(addem 1)"
echo "Adding 1, 2, 3 : $(addem 1 2 3)"

$ . function3.sh 
Adding 10 and 15: 25
Adding 1 and 1 : 2
Adding 1, 2, 3 : -1

Shell Script에서 전역 및 지역 변수 

기본적으로 Shell script에서 정의되는 모든 변수들은 전역 변수로 설정이 된다. 다만, 지역 변수로 변수를 설정하고자 하는 경우에는 반드시 변수 선언 앞에 local 키워드를 사용해야한다. 

1) 전역 변수 선언: 별도의 키워드 없이 변수 선언이 모두 전역 변수로 정의됨 
2) 지역 변수 선언: local <변수명> 


함수들의 라이브러리 만들기 

Shell script에서도 자주 사용되는 여러 함수들을 라이브러리의 형태로 만들어서 사용할 수 있다. 이러한 라이브러리를 만드는 방법과 사용하는 방법은 간단하다.

  (1) 스크립트에 필요한 기능들을 포함하는 공용 라이브러리 파일 (혹은 스크립트 파일)을 만든다. 
  (2) 위의 스크립트 파일을 이후 사용하는 쉘 스크립트에 포함시킨다. 
     ※ (1)에서 정의한 라이브러리 파일을 포함시킬때는 source 명령어(혹은 . 명령어)를 이용해서 불러와야 한다. 

ex) 라이브러리의 예시 
 - myfunctions.sh: 사용할 함수들을 정의한 파일 
 - example.sh: myfunctions.sh에 정의된 함수들을 사용하는 파일 

$ vim myfunctions.sh
function addem {
    echo $[ $1 + $2 ]
}
function multem {
    echo $[ $1 * $2 ]
}


$ vim example.sh
#! /bin/bash

source ./myfunctions.sh
value1=10
value2=5
echo " function addem: $(addem $value1 $value2)"
echo " function multem: $(multem $value1 $value2)"

$ . example.sh
 function addem: 15
 function multem: 50

 

728x90

댓글