스크립트뿐만 아니라 코딩을 잘 작성하기 위해서는 함수를 잘 사용하여야 한다.
많은 스크립트개발자들이 함수없이 스크립트를 작성하는 것을 볼 수 있다.
bash에서 함수를 사용하는 방법을 알아 보자.


함수호출은 다음과 같이 함수 이름과 파라메터가 있다면 리스팅한다.
함수 안에서는 local 키워드 뒤에 지역변수를 지정하고 초기값을 지정할 수 있다.
함수 안에서 Argument는 C언어에서와 같이 0, 1, 2, 3 .. 순서로 시작하며,
첫번째 파라메터는 $1, 두번째는 $2와 같이 참조할 수 있다. 다음을 실행시커 보자.

bash_func_1.png


지정하지 않은 Actual Argument를 참조하면 null-string이 할당됨을 알 수 있다.
"로 둘러싸인 문자열에서 $는 escape-char로 인식되지만 '는 문자그대로 인식된다.
'로 둘러싸인 문자열에서는 ($를 포함하여) 거의 모든 문자들이 그대로 인쇄된다.

빈칸이 있는 스트링을 파라메터로 보내기 위해서는 함수호출 시에 따옴표로 묶어준다.

bash_func_2.png



파라메터의 숫자는 $#로 알 수 있다.

bash_func_3.png


함수이름은 '파라메터 수'에 더해지지 않는 것을 볼 수 있다.
함수이름은 다음에서 볼 수 있듯이 $0로 참조할 수 있다.

bash_func_4.png


shift(내부)명령은 Actual파라메터리스트를 좌측(!)으로 이동시킨다.
그래서 $1는 잃어버리고 '$2가 $1로', '$3가 $1로' 된다.

bash에서 함수의 반환값은 $?로 참조할 수 있다.

bash_func_5.png


관습적으로 '0은 true'이고 '0이 아닌 값은 false'이다.
그것은 왜 그런지는 Unix명령의 exit-status에 기인한다. 다음과 같은 코드를 보면,

if grep -q AAA '/usr/src/linux-3.17/kernel/*.c'; then
   echo 'AAA found!'
fi

grep명령이 파일에서 AAA문자열을 발견할 경우 exit-status는 0이고
발견하기 못한 경우는 0이 아닌 값이 된다.


함수실행의 결과를 보내거나 얻기위해서 '$()'을 사용할 수 있다.
return을 사용할 수 있지만 일반적이지 않다.
다음과 같이 함수내에서 echo를 이용하여 출력한 문자열을 '$()'을 통해서 변수('retstr')에 할당할 수 있다.

bash_func_6.png