변환 처리_01 실행 시 변수값이 비어 있을 때 기본값을 정의해서 설정하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: cp, tar
키워드: 미정의, 기본값
사용처: 환경 변수가 설정되었으면 그 값을 쓰고 설정되지 않았으면 스크립트에서 정한 기본값을 사용하고 싶을때


실행예제

$ ./var-parameter.sh
Extract files to /var/tmp

스크립트

#!/bin/sh

cp largefile.tar.gz ${TMPDIR:=/tmp}  #---- 1
cd $TMPDIR
tar xzf largefile.tar.gz

echo "Extract files to $TMPDIR."

   

해설

이 스크립트는 변수 TMPDIR 값을 확인해서 설정값이 있으면 그 값을, 설정되어 있지 않거나 빈 문자열이면 /tmp를 작업 디렉터리로해서 아카이브 파일을 풉니다.

1에 있는 :=는 변수에 값이 설정되어 있는지 확인해서 값을 대입합니다. ${변수명:=값} 이라고 적으면 변수가 설정되어 있지 않거나 비어 있을 때는 지정한 값을 대입합니다.

즉, 환경 변수 TMPDIR에 /var/tmp라는 값이 미리 설정되어 있으면 작업 디렉터리는 /var/tmp가 됩니다. 한편, 환경 변수 TMPDIR에 값이 설정되어 있지 않거나 빈 문자열이면 스크립트는 기본값으로 정한 /tmp를 작업 디렉터리로 사용합니다.

1에는 명령어 일부로 대입을 하는데, 스크립트 앞 부분에 우선 이 처리를 해서 변수를 초기화하고 싶을 때에는 다음처럼 :(널 명령어)을 사용하면 됩니다.

: ${TMPDIR:=/tmp}

이 예제처럼 어떤 변수가 이미 설정되어 있는지 확인해서 설정되어 있지 않으면 기본값을 지정하는 방식은 환경 변수를 쓰는 셸 스크립트에서 자주 사용됩니다.

사용자가 /large/tmp라는 거대한 디스크를 마운트한 디렉터리를 작업 디렉터리로 사용하고 싶다고 가정합니다. 이때 다음처럼 환경 변수 TMPDIR을 설정하고 나서 스크립트를 기동하면 스크립트 자체를 수정하지 않아도 작업 디렉터리를 지정할 수 있습니다.

$ TMPDIR=/large/tmp; export TMPDIR
$ ./var-parameter.sh
Extract files to /large/tmp.

   

:- 그리고 :? 그리고 :+

:=를 사용해서 기본값을 설정하면 원래 변수값을 기본값으로 덮어쓰게 됩니다. 그러지 않고 원래 변수값이 설정되어 있는지만 확인하고 값은 덮어쓰지 않을 때는 :-을 사용합니다.

  • 파일1임시로 변수를 확인하고 싶을 때

    #!/bin/sh
    
    cp largefile.tar.gz ${TMPDIR:-/tmp}  #------------------ 1
    # $TMPDIR은 원래 값이 NULL이면 NULL인 채로 그대로 둠  #--- 2
    cd $TMPDIR
    

위 예에서 TMPDIR이 설정되어 있지 않으면 1에서는 파일이 /tmp에 복사됩니다. 하지만 값 대입은 일어나지 않으므로 2에서는 인수 없는 cd 명령어가 되어서 자신의 홈 디렉터리로 이동합니다.

그 외에도 비슷한 표기로 :?와 :+가 있는데 간단히 소개합니다.

$(var:?message}

셸 변수 var 값을 돌려줍니다. 하지만 셸 변수 var가 미정의 또는 빈 문자열이면 message를 출력하고 스크립트를 종료합니다. 이것은 다음처럼 변수가 미정의 또는 비어 있으면 에러를 내면서 종료하고 싶을 때 사용합니다.

# 셸 변수 MYDIR 확인. 미정의 또는 비었으면 에러 종료
: ${MYDIR:?셸 변수 MYDIR이 설정되어 있지 않음}

다음은 :+입니다.

${var:+word}

이것은 word를 돌려줍니다. 하지만 셸 변수 var가 미정의 또는 빈 문자열이면 null을 반환합니다. 이것은 변수 MYDIR이 설정되어 있으면 1을 반환하는 if문 같은 곳에 쓰입니다.

# 셸 변수 MYDIR확인. 빈 문자열이 아닌 값이면 플래그 flg를 1로 설정
flg=${MYDIR:+1}