웹사이트 검색

쉘 스크립트의 함수 이해 및 작성 - 6부


함수는 모든 프로그래밍 언어에서 중요한 역할을 합니다. 많은 실제 프로그래밍 언어와 마찬가지로 bash에는 제한된 구현으로 사용되는 기능이 있습니다.

기능이란 무엇입니까?

프로그래밍에서 함수는 특정 작업을 수행하는 프로그램의 섹션으로 명명됩니다. 이런 의미에서 함수는 일종의 프로시저 또는 루틴입니다. 함수가 호출되면 프로그램은 현재 코드 섹션을 떠나 함수 내부의 첫 번째 줄을 실행하기 시작합니다. 반복되는 코드가 있거나 작업이 반복되는 경우에는 대신 함수 사용을 고려해 보세요.

예를 들어 특정 프로그램의 여러 단계에서 숫자의 계승을 찾아야 하는 경우를 생각해 보세요. (팩토리얼을 계산하기 위해) 매번 전체 코드를 작성하는 대신, 블록 내에서 한 번 팩토리얼을 계산하는 코드 부분을 작성하고 동일한 코드를 여러 번 재사용할 수 있습니다.

함수를 작성하는 이유는 무엇입니까?

  1. 코드를 재사용하는 데 도움이 됩니다.
  2. 프로그램의 가독성을 향상시킵니다.
  3. 프로그램 내에서 변수를 효율적으로 사용합니다.
  4. 프로그램을 부분별로 테스트할 수 있습니다.
  5. 프로그램을 여러 하위 단계로 표시합니다.
쉘 스크립트의 함수

쉘 스크립트에서 함수를 작성하는 일반적인 구문에는 다음과 같은 방법이 포함됩니다.

function func_name {
	. . .
	commands
	. . .
}

or

func_name ( ) {
	. . .
	commands
	. . .
}

Opening curly braces can also be used in the second line as well.

func_name ( )
{
	. . .
	commands
	. . .
}

쉘 스크립트에서 일반적으로 하는 것처럼 이러한 기능 블록 내에 유효한 명령을 언제든지 자유롭게 작성할 수 있습니다. 이제 내부에 작은 함수가 포함된 간단한 스크립트 하나를 작성해 보겠습니다.

#!/bin/bash

call_echo ( ) {
	echo ‘This is inside function’
}

op=$1

if [ $# -ne 1 ]; then
	echo "Usage: $0 <1/0>"
else
	if [ $1 = 0 ] ; then
		echo ‘This is outside function’
	elif [ $1 = 1 ] ; then
		call_echo
	else
		echo ‘Invalid argument’
	fi
fi

exit 0

함수 정의는 함수에 대한 첫 번째 호출보다 선행되어야 합니다. 호출하기 전에 '함수를 선언'하는 것과 같은 것은 없습니다. 그리고 우리는 항상 함수 안에 함수를 중첩할 수 있습니다.

참고:- 빈 함수를 작성하면 항상 구문 오류가 발생합니다.

동일한 함수가 여러 번 정의되면 최종 버전이 호출됩니다. 예를 들어 보겠습니다.

#!/bin/bash

func_same ( ) {
	echo ‘First definition’
}

func_same ( ) {
	echo ‘Second definition’
}

func_same

exit 0
매개변수를 취하고 값을 반환하는 함수

매개변수를 취하고 값을 반환하는 함수를 고려하여 더 깊이 들어가 보겠습니다. 함수에서 값을 반환하려면 내장된 'return' 쉘을 사용합니다. 구문은 다음과 같습니다.

func_name ( ) {
	. . .
	commands
	. . .
	return $ret_val
}

마찬가지로 아래와 같이 공백으로 구분된 함수에 인수를 전달할 수 있습니다.

func_name $arg_1 $arg_2 $arg_3

함수 내에서 $1, $2, $3 등의 순서로 인수에 액세스할 수 있습니다. 더 명확성을 추가하기 위해 함수를 사용하여 최대 두 개의 정수를 찾으려면 다음 예제 스크립트를 살펴보십시오.

#!/bin/bash

USG_ERR=7

max_two ( ) {
	if [ "$1" -eq "$2" ] ; then
		echo 'Equal'
		exit 0
	elif [ "$1" -gt "$2" ] ; then
		echo $1
	else
		echo $2
	fi
}

err_str ( ) {
	echo "Usage: $0 <number1>  <number2>"
	exit $USG_ERR
}

NUM_1=$1
NUM_2=$2
x
if [ $# -ne 2 ] ; then
	err_str
elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then
	if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then  
		max_two $NUM_1 $NUM_2
	else
		err_str
	fi
else
	err_str
fi

exit 0

위의 내용은 다소 복잡해 보이지만, 한 줄씩 읽어보면 간단합니다. 먼저 검증 목적으로 중첩된 if-else if 라인, 즉 정규식을 사용하여 인수의 수와 유형을 확인합니다. 그런 다음 두 개의 명령줄 인수를 사용하여 함수를 호출하고 그 자체에 결과를 표시합니다. 이는 함수에서 큰 정수를 반환할 수 없기 때문입니다. 이 문제를 해결하는 또 다른 방법은 전역 변수를 사용하여 결과를 함수 내에 저장하는 것입니다. 아래 스크립트는 이 방법을 설명합니다.

#!/bin/bash

USG_ERR=7
ret_val=

max_two ( ) {
	if [ "$1" -eq "$2" ] ; then
		echo 'Equal'
		exit 0
	elif [ "$1" -gt "$2" ] ; then
		ret_val=$1
	else
		ret_val=$2
	fi
}

err_str ( ) {
	echo "Usage: $0 <number1>  <number2>"
	exit $USG_ERR
}

NUM_1=$1
NUM_2=$2

if [ $# -ne 2 ] ; then
	err_str
elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then
	if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then  
		max_two $NUM_1 $NUM_2
		echo $ret_val
	else
		err_str
	fi
else
	err_str
fi

exit 0

이제 다음과 같은 함수를 사용하여 이전 쉘 스크립팅 시리즈에서 설명했던 몇 가지 흥미로운 문제를 시도해 보십시오.

  1. 기본 Linux 셸 스크립팅 언어 팁 이해 – 1부
  2. Linux 초보자가 쉘 프로그래밍을 배울 수 있는 5가지 쉘 스크립트 - 2부
  3. Linux BASH 스크립팅의 세계 항해 - 3부
  4. Linux 쉘 프로그래밍의 수학적 측면 – 4부
  5. 쉘 스크립팅 언어로 수학적 표현식 계산 – 5부

다음 부분에서는 지역 변수 사용, 재귀 등과 같은 기능적 기능에 대해 더 많은 통찰력을 가지고 돌아오겠습니다. 의견을 통해 최신 정보를 받아보세요.