Bash 함수는 기본적으로 여러 번 호출할 수 있는 명령 집합입니다. 함수의 목적은 bash 스크립트를 보다 읽기 쉽게 만들고 동일한 코드를 반복적으로 쓰지 않도록 하기 위한 것입니다. 대부분의 프로그래밍 언어에 비해 Bash 기능은 다소 제한됩니다.
이 튜토리얼에서는 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
'SW > 리눅스' 카테고리의 다른 글
Debian 9 : Visual Studio Code 설치 방법, 예제, 명령어 (0) | 2021.05.10 |
---|---|
CentOS 7 : Redmine 설치, 구성 방법, 예제, 명령어 (1) | 2021.05.09 |
CentOS 7 : FFmpeg 설치, 사용 방법, 예제, 명령어 (0) | 2021.05.07 |
Linux : Tee 명령어 예제들 알아보기 (0) | 2021.05.06 |
Debian : 설치된 패키지 나열하는 방법 (0) | 2021.05.05 |