[Linux 셸 스크립트] 변환처리 - 012 지역 변수를 함수 안에 정의해서 호출한 곳의 변수가 변경되지 않게 하기
본문 바로가기
IT 이야기/Linux 셸 스크립트

[Linux 셸 스크립트] 변환처리 - 012 지역 변수를 함수 안에 정의해서 호출한 곳의 변수가 변경되지 않게 하기

by 찬찬이 아빠 2021. 3. 5.
반응형
  1. 사용 명령어

(1) ls

(2) local 

 

 

  2. 키워드 & 사용처

(1) 키워드

지역 변수, 전역 변수, 스코프

 

(2) 사용처

함수 내부에서 변수를 다룰 때 호출한 곳에 영향을 주지 않도록 지역 변수로 정의하고 싶을 때 사용합니다.

 

  3. 실행 예제
$ ./local-var.sh
directory: /home/park/logdir
20210303.log 20210304.log

directory: /var/tmp
tmp.dat	tmp.3113

 

 

  4. 스크립트

#!/bin/sh

 

DIR=/var/tmp

 

ls_home()

{

    # 변수 DIR을 함수 내부 변수로 정의

    local DIR                     

 

    DIR=~/$1                   

    echo "directory: $DIR"

    ls $DIR

}

 

ls_home logdir             

ls $DIR                           

 

 

  5. 해설

이 스크립트는 홈 디렉터리 바로 아래에 logdir이라는 디렉터리 안에 있는 파일과 셸 변수 DIR로 지정한 /var/tmp 디렉터리 안에 있는 파일을 ls 명령어로 순서대로 표시하는 간단한 스크립트입니다.

 

시작할 때 ls_home이라는 함수를 만드는데 이 함수는 홈 디렉터리 아래에 있는 인수($1)로 받은 이름의 서브디렉터리를 표시합니다. 에서 logdir이라는 인수를 넘기므로 의 $1값은 logdir이 됩니다.

 

또한 에서는 ~(틸다) 기호를 사용하여 홈 디렉터리 경로를 얻습니다. 셸 스크립트에서 ~는 홈 디렉터리 경로가 됩니다. 즉, 스크립트를 실행한 사용자명이 user1이라면 ~/home/park/가 됩니다. 따라서 는 실행 시 "DIR=/home/park/logdir" 같이 됩니다.

 

많은 프로그래밍 언어가 함수에서 정의한 변수를 그 함수 안에서만 유효한 지역 변수로 삼습니다. 하지만 셸 스크립트는 기본적으로 변수 모두를 전역 변수로 취급합니다. 따라서 함수 안에서 변수값을 변경하면 스크립트 전체에 영향을 미칩니다.

 

즉 ②의 셸 변수 대입문은 이 스크립트 서두에 선언한 DIR=/var/tmp에 영향을 줍니다. 이를 피하기 위해 ①에서 local 명령어를 써서 변수를 선언합니다. 호출한 시점에 이미 DIR이라는 셸 변수가 사용되었지만 ls_home 함수 안에 있는 같은 이름의 셸 변수 DIR은 지역 변수이므로 호출한 곳에 영향을 주지 않습니다.

 

만약 함수안에서 local 명령어를 쓰지 않았다면 변수값은 변경되어 ④에서 /var/tmp가 아닌 ~/logdir이 출력됩니다.

$ ./local.sh
directory : /home/park/logdir
20210304.log	20210305.log

directory : /home/park/logdir
20210304.log	20210305.log

 

 

 

참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전

반응형

댓글