Computer >> 컴퓨터 >  >> 프로그래밍 >> Bash 프로그래밍

Bash 셸 함수 완벽 가이드: 실전 예제 6가지로 배우는 함수 활용법

Bash 셸 함수 완벽 가이드: 실전 예제 6가지로 배우는 함수 활용법Bash 셸 함수(shell function)란 여러 개의 UNIX/Linux 명령어를 하나의 이름으로 묶어두고, 필요할 때 그 이름만으로 한 번에 실행할 수 있게 해주는 기능입니다. Bash 셸 함수는 일반 유닉스 명령어처럼 실행할 수 있으며, 별도의 새 프로세스를 생성하지 않고 현재 셸 컨텍스트 안에서 바로 해석되어 실행됩니다.

셸 별칭(alias)과 함수 모두 길거나 복잡한 명령어를 짧은 형태로 정의할 수 있다는 공통점이 있습니다. 하지만 별칭과 달리 함수는 조건문·반복문 같은 제어 흐름(control-flow)과 인수(arguments) 처리 등 훨씬 다양하고 강력한 기능을 사용할 수 있습니다.

이 글은 진행 중인 Bash 튜토리얼 시리즈의 일부입니다. 이전에 다룬 Bash 소개, 종료 상태(exit status), 별칭 예제 관련 글도 함께 참고하시면 좋습니다.

Bash 함수 생성 문법

function functionname()
{
commands
.
.
}
  • function: 키워드이며 생략해도 됩니다(선택 사항).
  • functionname: 함수의 이름입니다.
  • commands: 함수 내부에서 실행될 명령어 목록입니다.

함수는 인수를 받을 수 있습니다. 함수가 실행될 때 전달된 인수들은 위치 매개변수(positional parameters)가 되며, 위치 매개변수 0에는 항상 스크립트 이름이 들어가며 변경되지 않습니다.

명령줄에서 Bash 함수를 호출하는 방법은 아래와 같습니다:

$ functionname arg1 arg2
  • 셸이 리눅스 명령어를 해석할 때는 먼저 break, continue, eval, exec 같은 특수 내장 함수를 확인한 후, 그다음 셸 함수를 찾습니다.
  • Bash 함수의 종료 상태(exit status)는 함수 본문에서 마지막으로 실행된 명령어의 종료 상태와 동일합니다.

참고: 셸 함수 정의는 셸 시작 파일(예: .bash_profile)에 넣어두면 좋습니다. 이렇게 하면 언제든지 명령줄에서 해당 함수를 사용할 수 있습니다. .bash_profile이 언제 실행되는지 궁금하다면 이전에 작성한 Bash 실행 순서 관련 글을 참고하세요.

예제 1: 특정 확장자를 가진 파일 목록 자세히 출력하기

"lsext" 함수는 현재 디렉터리에서 지정한 확장자를 가진 파일 목록을 찾아 출력합니다. find 명령어와 ls 명령어를 조합하여 작업을 수행합니다.

$ function lsext()
{
find . -type f -iname '*.'${1}'' -exec ls -l {} \; ;
}

$ cd ~

$ lsext txt
-rw-r--r-- 1 root root   24 Dec 15 14:00 InMorning.txt
-rw-r--r-- 1 root root  184 Dec 16 11:45 Changes16.txt
-rw-r--r-- 1 root root  458 Dec 18 11:04 Changes18.txt
-rw-r--r-- 1 root root 1821 Feb  4 15:01 ChangesOfDB.txt

예제 2: 여러 파일에 특정 리눅스 명령어 일괄 실행하기

다음 예제의 "batchexec" 함수는 지정한 확장자를 가진 파일들을 찾아, 선택된 파일들에 지정한 명령어를 일괄 실행합니다.

$ function batchexec()
{
find . -type f -iname '*.'${1}'' -exec ${@:2}  {} \; ;
}

$ cd ~

$ batchexec sh ls

$ batchexec sh chmod 755

$ ls -l *.sh
-rwxr-xr-x 1 root root  144 Mar  9 14:39 debug.sh
-rwxr-xr-x 1 root root 5431 Jan 25 11:32 get_opc_vers.sh
-rwxr-xr-x 1 root root   22 Mar 18 08:32 t.sh

위 예제에서는 .sh 확장자를 가진 모든 셸 스크립트 파일을 찾아 권한을 755로 변경합니다(사용자에게는 모든 권한, 그룹과 기타 사용자에게는 읽기·실행 권한 부여). 함수 정의에서 눈여겨볼 부분은 "${@:2}"인데, 이는 두 번째 이후의 위치 매개변수를 의미합니다(셸 확장 기능).

예제 3: 랜덤 비밀번호 생성하기

다음 함수는 특수 문자를 포함한 강력한 랜덤 비밀번호를 지정한 길이만큼 생성합니다. 길이를 지정하지 않으면 기본값으로 12자 길이의 비밀번호를 만듭니다.

$ function rpass() {
        cat /dev/urandom | tr -cd '[:graph:]' | head -c ${1:-12}
}

$ rpass 6
-Ju.T[[

$ rpass
Gz1f!aKN^""k

위 예제에서 rpass를 인수 6과 함께 실행하면 6자리 랜덤 비밀번호가 생성되고, 인수 없이 rpass를 실행하면 12자리 비밀번호가 생성됩니다. ${1:-12}는 $1이 설정되지 않았거나 null일 경우 12를 반환하고, 그렇지 않으면 $1의 값으로 대체한다는 의미입니다.

예제 4: 특정 인터페이스의 IP 주소 조회하기

다음 예제는 'getip'라는 함수를 정의합니다. 이 함수는 인터페이스 이름을 인수로 받아, 해당 인터페이스에 할당된 IP 주소를 반환합니다(기본값은 eth0의 IP 주소). ifconfig 명령어를 사용하여 IP 주소를 가져옵니다.

$ function getip()
{
/sbin/ifconfig ${1:-eth0} | awk '/inet addr/ {print $2}' | awk -F: '{print $2}';
}

$ getip
15.110.106.86

$ getip eth0
15.110.106.86

$ getip lo
127.0.0.1

예제 5: 시스템 정보 한눈에 확인하기

이 예제는 시스템에 대한 필수 정보를 모두 보여주는 함수를 정의합니다. 시작 파일에 이 함수를 정의하고 호출하도록 설정하면, 로그인할 때마다 시스템 정보를 자동으로 확인할 수 있습니다.

$ function mach()
{
    echo -e "\nMachine information:" ; uname -a
    echo -e "\nUsers logged on:" ; w -h
    echo -e "\nCurrent date :" ; date
    echo -e "\nMachine status :" ; uptime
    echo -e "\nMemory status :" ; free
    echo -e "\nFilesystem status :"; df -h
}

$ mach
Machine information:
Linux dev-db 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 GNU/Linux

Users logged on:
root     pts/2    ptal.mot Wed10    0.00s  1.35s  0.01s w -h

Current date :
Thu Mar 18 11:59:36 CET 2010

Machine status :
 11:59:36 up 7 days, 3 min,  1 user,  load average: 0.01, 0.15, 0.15

Memory status :
             total       used       free     shared    buffers     cached
Mem:       2059768    2033212      26556          0      81912     797560
-/+ buffers/cache:    1153740     906028
Swap:      4192956      48164    4144792

Filesystem status :
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              12G   12G     0 100% /
tmpfs                1006M  377M  629M  38% /dev/shm
/dev/sdc5             9.9G  409M  9.0G   5% /mydisk

예제 6: ls 출력 결과를 더 보기 좋게 정렬하기

다음 함수는 화면을 지우고 커서를 화면 맨 위로 이동시킨 뒤 ls를 실행하고, 마지막으로 커서를 화면 끝으로 옮깁니다.

$ function ll ()
{
    clear;
    tput cup 0 0;
    ls --color=auto -F --color=always -lhFrt;
    tput cup 40 0;
}

$ ll

type 명령어로 함수 코드 확인하기

type은 셸 내장 명령어로, 함수의 코드를 확인할 때 사용합니다.

문법:
type function-name
$ type ll
ll is a function
ll ()
{
    clear;
    tput cup 0 0;
    ls --color=auto -F --color=always -lhFrt;
    tput cup 40 0;
    alias ls="ls --color=auto -F"
}

참고용으로 이 글에서 소개한 6가지 함수 전체를 담은 샘플 .bash_profile functions 파일도 제공되니 활용해 보세요.

모든 함수를 ~/.bash_profile 파일에 추가해 두면, 매번 새로 만들 필요 없이 언제든지 이 함수들을 바로 사용할 수 있습니다.