SW/리눅스

Linux : Bash 함수 사용 방법, 예제, 명령어

얇은생각 2021. 5. 8. 07:30
반응형

Bash 함수는 기본적으로 여러 번 호출할 수 있는 명령 집합입니다. 함수의 목적은 bash 스크립트를 보다 읽기 쉽게 만들고 동일한 코드를 반복적으로 쓰지 않도록 하기 위한 것입니다. 대부분의 프로그래밍 언어에 비해 Bash 기능은 다소 제한됩니다.

이 튜토리얼에서는 Bash 기능의 기본 사항을 다루고 셸 스크립트에서 사용하는 방법을 보여드리겠습니다.

 

 

Linux : Bash 함수 사용 방법, 예제, 명령어

 

 

배시 함수 정의

바시 함수를 선언하는 구문은 간단합니다. 기능은 두 가지 다른 형식으로 선언할 수 있습니다.

첫 번째 형식은 함수 이름으로 시작하고 괄호 뒤에 나옵니다. 이것은 선호되고 더 많이 사용되는 형식입니다.

function_name () {
  commands
}

 

 

단일 라인 버전:

function_name () { commands; }

 

 

두 번째 형식은 예약된 단어 함수로 시작하고 그 다음 함수 이름으로 시작합니다.

function function_name {
  commands
}

 

 

단일 라인 버전:

function function_name { commands; }

 

 

주목할 점은 다음과 같습니다. 

컬리 브레이스({}) 사이의 명령을 함수의 본문이라고 합니다. 꼬불꼬불한 치열 교정기는 공백이나 새 선으로 body와 분리해야 합니다.

함수를 정의해도 실행되지 않습니다. bash 함수를 호출하려면 함수 이름을 사용하면 됩니다. 셸 스크립트에서 함수를 호출할 때마다 컬리 브레이스 사이의 명령이 실행됩니다.

함수 정의는 함수에 대한 호출보다 먼저 배치되어야 합니다.

"compacted" 함수를 사용하는 경우 세미콜론;은 함수의 마지막 명령을 따라야 합니다.

항상 함수 이름을 설명하도록 하십시오.

이 문제를 더 잘 이해하기 위해 다음 예를 살펴보십시오.

 

# ~/hello_world.sh

#!/bin/bash

hello_world () {
   echo 'hello, world'
}

hello_world

 

 

코드를 한 줄씩 분석해보겠습니다.

3행에서는 함수를 이름을 지정하여 정의하고 있습니다. 곱슬곱슬한 가새 {는 함수 본체의 시작을 나타냅니다.

라인 4는 기능 본체입니다. 함수 본문에는 여러 명령, 문 및 변수 선언이 포함될 수 있습니다.

줄 5, 닫히는 컬리 브래킷 }은 hello_world 함수의 끝을 정의합니다.

7번 라인에서 우리는 그 기능을 실행하고 있습니다. 필요한 횟수만큼 기능을 실행할 수 있습니다.

스크립트를 실행하면 Hello, world가 인쇄됩니다.

 

 

 

변수 범위

전역 변수는 범위에 관계없이 스크립트의 모든 위치에서 액세스할 수 있는 변수입니다. Bash에서는 함수 내부에 선언된 경우에도 기본적으로 모든 변수가 전역으로 정의됩니다.

로컬 변수는 로컬 키워드를 사용하여 함수 본문 내에서 선언할 수 있으며 해당 함수 내에서만 사용할 수 있습니다. 서로 다른 함수에 동일한 이름을 가진 로컬 변수를 사용할 수 있습니다.

Bash에서 변수 범위가 작동하는 방식을 더 잘 설명하기 위해 다음 예를 살펴보겠습니다.

# ~/variables_scope.sh

#!/bin/bash

var1='A'
var2='B'

my_function () {
  local var1='C'
  var2='D'
  echo "Inside function: var1: $var1, var2: $var2"
}

echo "Before executing function: var1: $var1, var2: $var2"

my_function

echo "After executing function: var1: $var1, var2: $var2"

 

 

이 스크립트는 두 개의 글로벌 변수 var1과 var2를 정의하는 것으로 시작합니다. 그런 다음 로컬 변수 var1을 설정하고 글로벌 변수 var2를 수정하는 기능이 있습니다. 

스크립트를 실행하는 경우 다음 출력이 표시됩니다.

# Before executing function: var1: A, var2: B
# Inside function: var1: C, var2: D
# After executing function: var1: A, var2: D

 

 

위의 출력에서 우리는 다음과 같이 결론을 내릴 수 있습니다.

함수 본문 내부에서 기존 전역 변수와 동일한 이름을 가진 로컬 변수를 설정하면 전역 변수보다 우선합니다.

함수 내에서 전역 변수를 변경할 수 있습니다.

 

 

 

값을 반환

"실제" 프로그래밍 언어의 함수와 달리 Bash 함수는 호출할 때 값을 반환할 수 없습니다. bash 함수가 완료되면 해당 함수의 반환 값은 함수에서 실행된 마지막 문의 상태, 성공 시 0, 실패 시 1 - 255 범위의 0이 아닌 소수점 이하 숫자입니다.

반환 상태는 반환 키워드를 사용하여 지정할 수 있으며 변수 $?에 할당됩니다. 반환 문이 함수를 종료합니다. 함수의 종료 상태라고 생각할 수 있습니다.

# ~/return_values.sh

#!/bin/bash

my_function () {
  echo "some result"
  return 55
}

my_function
echo $?

# some result
# 55

 

 

함수에서 임의의 값을 실제로 반환하려면 다른 방법을 사용해야 합니다. 가장 간단한 옵션은 함수의 결과를 전역 변수에 할당하는 것입니다.

# ~/return_values.sh

#!/bin/bash

my_function () {
  func_result="some result"
}

my_function
echo $func_result

# some result

 

 

함수에서 값을 반환하는 더 나은 또 다른 옵션은 아래 표시된 에코 또는 인쇄 f를 사용하여 값을 stdout으로 보내는 것입니다.

# ~/return_values.sh

#!/bin/bash

my_function () {
  local func_result="some result"
  echo "$func_result"
}

func_result="$(my_function)"
echo $func_result

# some result

 

 

단순히 메시지를 stdout으로 출력하는 함수를 실행하는 대신 $() 명령 대체를 사용하여 함수 출력을 func_result 변수에 할당하고 있습니다. 나중에 필요에 따라 변수를 사용할 수 있습니다.

 

 

 

Bash 함수에 인수 전달

원하는 수의 인수를 bash 함수에 전달하려면 함수 이름 바로 뒤에 공백으로 구분하면 됩니다. 인수가 공백으로 잘못 구문 분석되지 않도록 인수의 값을 두 번 따옴표로 묶는 것이 좋습니다.

- 전달된 매개 변수는 $1, $2, $3 … $n이며, 함수 이름 뒤에 있는 매개 변수의 위치에 해당합니다.

- $0 변수는 함수 이름에 대해 예약됩니다.

- $# 변수는 함수에 전달된 위치 매개변수/인수의 수를 저장합니다.

- $* 및 $@ 변수는 함수에 전달된 모든 위치 파라미터/인수를 유지합니다.

    - 이중 인용 시 "$*"는 공백으로 구분된 단일 문자열("$1$2$n")로 확장됩니다.

    - 이중 인용 시 "$@"는 "$1" "$2" "$n"의 개별 문자열로 확장됩니다.

    - 이중으로 인용하지 않을 때는 $*와 $@가 같습니다.

# ~/passing_arguments.sh

#!/bin/bash

greeting () {
  echo "Hello $1"
}

greeting "Joe"

# Hello Joe

 

반응형