[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 명령어를 사용하지 않으면 함수 내부에서 변숫값이 변경됩니다.



결과