- 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어
명령어: 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}