[유닉스] 쉘 스크립트(Shell Script) 함수


함수

  • 앨리어스를 이용하면 간단한 명령들을 하나의 다른 이름으로 재정의하여 사용할 수 있음
  • 명령을 조건에 따라 다르게 실행하거나 인자를 받아 처리해야 할 때 함수를 사용
  • 함수는 스크립트 안에서 정의하여 프로그래밍에 활용될 수도 있고, 사용자 초기화 파일에 정의하여 나만의 명령으로 사용할 수도 있음

함수의 정의

  • 함수를 프롬프트에서 정의해 사용 가능
  • 함수의 본문을 나타내는 중괄호는 함수 이름 다음에 써도 되지만, 앞뒤에 공백을 주어 다른 문자열과 구분해야 함
  • 기본 형식
function functioname
{
  명령들
}
  • 지우려는 파일을 휴지통으로 보내는 함수 만들기
    • 휴지통으로 사용할 디렉토리 생성
    • 디렉토리 이름은 .으로 시작하여 숨김 파일로
    • 프롬프트에서 function 키워드와 함수 이름을 입력하면 프롬프트가 PS2 변수에 지정된 2차 프롬프트로 변경되어 다음 입력을 기다림
    • { } 사이에 원하는 명령을 입력
$ mkdir ~/.TRASH
$ function trash {
> mv $* ~/.TRASH
> }
$
  • 함수가 올바로 정의되었는지 확인하려면 typeset –f 명령 이용
    • 정의되어 있는 모든 함수의 목록을 보여줌
$ typeset -f
trash ( )
{
  mv $* ~/.TRASH
}
$

함수 호출

  • 파일 생성 후 .TRASH 디렉토리로 삭제
  • trash 함수를 .profile이나 .bashrc 파일에 저장하면 이후 로그인할 때마다 이 함수를 사용할 수 있음
  • 앨리어스를 이용해 rm 명령을 trash 함수로 바꾸어 놓을 수도 있음
$ touch a b c
$ trash a b c
$ ls
$ ls ~/.TRASH
a b c
$

함수의 종료 : return 문

  • 함수 본문의 마지막 문장을 실행하거나 return 문을 만나면 종료
  • 함수의 종료 값은 return 명령으로 지정
  • return 명령이 없으면 함수 안의 마지막 명령의 종료 상태 값이 함수의 종료 값이 되고 $? 변수에 저장됨
  • 예제 : 인자로 주어진 두 값을 더하는 스크립트
$ cat n test_add
1 #!/bin/bash
2 #
3 # test sum function
4 #
5
6 function sum {
7     typeset sum
8
9     (( sum = $1 + $2 ))
10    return $sum
11 }
12
13 sum $1 $2
14 echo “$1 + $2 = $?
$
  • 실행 결과
$ chmod +x test_add
$ ./test_add 1 2
1 + 2 = 3
$

함수 삭제

  • unset 명령을 이용해 삭제
$ unset f trash
$ typeset -f
$

함수 예제

  • 여러 곳의 target으로 파일을 복사하는 함수를 작성하여, temp란 파일을 백업 파일로 복사하는 쉘 프로그램
    • shift는 받아들인 인수를 하나씩 shift하는 명령
    • shift 명령을 쓰면 두 번째 인수로 offset이 됨
    • “$#”은 받아들인 인수의 개수
    • “$1”은 첫 번재 인수, “$2”는 두 번째 인수
$ cat mcp
multicopy()
{
    source=$1
    while [ $# -gt 1 ]
    do
      cp $source $2
      shift
    done
}
multicopy $1 $2 $3 $4
echo $1“의 백업파일 ”$2 $3 $3  생성되었습니다.
^z
$ ls
document mc temp test
$ mcp temp temp1 temp2 temp3
temp 백업파일 temp1 temp2 temp3  생성되었습니다.
$ ls
document mc temp temp1 temp2 temp3 test
$