[Shell Script] 지역변수를 함수 안에 정의해서 호출한 곳의 변수가 파괴 되지 않게 하기
지역변수를 함수 안에 정의해서 호출한 곳의 변수가 파괴 되지 않게 하기
이 스크립트는 홈디렉터리 바로 아래 logdir이라는 디렉터리 안에 있는 파일과 셸 변수 DIR로 지정한 /var/tmp 디렉터리 안에 있는 파일을 ls 명령어로 순서대로 표시하는 스크립트 입니다 .
#!/bin/sh
DIR=/var/tmp
ls_home()
{
#변수 DIR을 함수 내부 변수로 정의
local DIR #1
DIR=~/$1 #2
echo "directory : $DIR"
ls $DIR
}
ls_home logdir #3
echo "directory:$DIR " #4
ls $DIR
함수 내부에서 변수를 다룰 때 호출한 곳에 영향을 주지 않도록 지역변수로 정의 하고 싶을 때 사용합니다 .
해설
시작할 때 ls_home 이라는 함수를 만드는데 이 함수는 홈디렉터리 아래에 있는 인수 ($1)로 받은 이름의 서브디렉토리를 표시합니다 .
#3 에서 logdir이라는 인수를 넘기므로 #2 의 $1 값은 logdir이 됩니다 .
#2에서 ~기호를 사용하여 홈디렉토리를 얻습니다 . (셸 스크립트에서는 ~는 홈디렉토리)
이 스크립트를 실행한 사용자가 root라면 ~는 home이아닌 /root/logdir로 가게됩니다 .
많은 프로그래밍 언어가 함수에서 정의한 변수를 그함수 안에서만 유효한 지역 변수로 삼습니다 . 하지만 셸 스크립트는 기본적으로 모든 변수로 전역변수로 취급 합니다 . 따라서 함수 안에서 변숫값을 변경하면 스크립트 전체에 영향을 끼칩니다 .
#2의 변수 대입문은 이스크립트 처음에 선언한 /var/tmp에 영향을 줍니다 . 이를 피하기위해 #1에서 local명령어를 써서 변수를 선언합니다 .
만약 local 명령어를 사용하지 않았다면 변숫값은 변경되어 #4에서 /var/tmp가 아닌 ~/logdir이 출력 될것입니다 .
local 명령어를 사용하지 않으면 함수 내부에서 변숫값이 변경됩니다.
결과