Bash
스크립트는 함수 기능을 지원한다. 이를 통해 여러번 사용되는 구문들, 특정한 기능을 하는 구문들을 묶어 하나의 함수로 만들 수 있다.
#!/bin/bash
function <함수 이름> {
<함수 구문들>
...
<return <반환값>>
}
일반적으로 위와 같은 형태를 지니며 함수를 반환하지 않아도 상관은 없다.
함수의 호출은 소괄호없이 그냥 함수의 이름만 작성하면 된다.
#!/bin/bash
function test {
echo "test function"
}
test
함수는 return
구문을 통해 반환되어질 수 있다. 사실상 하나의 프로그램으로 볼 수 있다. 여느 프로그램과 마찬가지로 리눅스 환경에서 함수는 0
~ 255
사이의 값을 반환할 수 있으며, $?
플레이스홀더를 이용해서 그 결과를 획득할 수 있다.
#!/bin/bash
function test {
echo "test will return 12"
return 12
}
test
echo "return value of test: $?"
Bash
스크립트를 작성하다면 보면 0 ~ 255
보다 더 크거나 작은 수, 혹은 실수, 더 나아가 문자열을 반환해야 하는 상황이 발생할 수 있다. 이러한 경우엔 return
을 통해서 그 값을 획득할 수 없다.
그러나, 전술한 것처럼 함수는 프로그램과 비슷하게 취급되므로 해당 함수의 출력 결과를 반환값처럼 가져와 사용할 수 있다:
#!/bin/bash
function test {
echo "hello"
}
echo "$(test) world!"
여러 개의 인자를 IFS
단위로 쪼개어 echo
함으로써, 호출자 쪽에서 이를 리스트로 받아낼 수 있다.
함수 내에서 선언한 모든 변수는 global
변수이며, 함수 밖이든 안이든, 심지어 다른 함수에서도 접근이 가능하게 된다. 따라서 함수 내부에서만 사용된다면 local
키워드를 사용해야 한다.
#!/bin/bash
num1=1
num2=2
function test {
num1=3
local num2=4
echo "num1 in test: $num1"
echo "num2 in test: $num2"
}
echo "num1: $num1"
echo "num2: $num2"
test
echo "num1: $num1"
echo "num2: $num2"
함수는 외부에서 인자를 전달받을 수 있다. 각 인자는 $1
, $2
, ..., $n
플레이스홀더를 통해 획득할 수 있다. 각 번호는 전달된 인자의 순서를 뜻한다. $#
은 전달된 인자의 개수, $@
는 전달된 인자 전체를 의미하며 반복문에서 placeholder
로 사용되어질 수 있다:
#!/bin/bash
function add_all {
local result=0
for num in $@
do
result=$(($result + $num))
done
echo $result
}
result=$(add_all 1 2 3 4 5)
echo "result: $result"
~ $ ./test.sh
~ $ result: 15