Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

쉘 스크립트의 함수 이해 및 쓰기 – 파트 VI

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

쉘 스크립트의 함수 이해 및 쓰기 – 파트 VI

기능이란 무엇입니까?

프로그래밍에서 함수는 특정 작업을 수행하는 프로그램의 명명된 섹션입니다. 이러한 의미에서 함수는 일종의 절차 또는 루틴입니다. 함수가 호출되면 프로그램은 코드의 현재 섹션을 떠나 함수 내부의 첫 번째 줄을 실행하기 시작합니다. 반복되는 코드가 있거나 작업이 반복될 때마다 대신 함수를 사용하는 것을 고려하십시오.

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

왜 함수를 작성합니까?

  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 셸 프로그래밍의 수학적 측면 – 파트 IV
  5. 셸 스크립팅 언어로 수학적 표현 계산하기 – 파트 V

다음 부분에서 지역 변수, 재귀 등을 사용하는 것과 같은 기능적 기능에 대한 더 많은 통찰력을 가지고 돌아올 것입니다. 댓글로 최신 소식을 받아보세요.