1. 사용 명령어 |
(1) env
(2) grep
(3) cut
2. 키워드 & 사용처 |
(1) 키워드
환경 변수, 분지라, 컬럼
(2) 사용처
설정된 환경 변수 목록을 얻어서 어떤 변수명이 정의되어 있는지 확인하고 싶을 때 사용합니다.
3. 실행 예제 |
$ ./env.sh <- 환경 변수 TMPVAR가 없으면 start.sh가 실행되지 않음
TMPVAR is null
$ export TMPVAR=1 <- 환경 변수 TMPVAR 설정
$ ./env.sh
TMPVAR is 1
[START] start.sh
4. 스크립트 |
#!/bin/sh
# 미리 설정하지 안흐면 에러가 발생하는 환경 변수 정의
envname="TMPVAR" ①
# env 명령어로 환경 변수 목록을 표시해서 cut 명령어로
# * 첫 번째 값을 표시 [-f 1]
# * 분지라는 : [-d "="]로 표시
env | cut -f 1 -d "=" > env.lst ②
# 확인할 환경 변수명이 env.lst와 같게 정의되어 있는지 확인
grep -q "^${envname}$" env.lst ③
if [ $? - eq 0 ]; then ④
# 환경 변수가 설정되어 있으면 start.sh 실행
echo "환경 변수 $envname가 설정되어 있습니다." ⑤
./start.sh
else
ceho "환경 변수 $envname가 설정되어 있지 않습니다."
fi
5. 해설 |
이 스크립트는 현재 설정한 환경 변수 목록을 env 명령어로 취득해서 지정한 환경 변수가 설정되어 있는지 판별합니다. 셸 스크립트는 환경 변수에 의존된 코드가 많으므로 미리 확인해서 사용하는 경우를 가정합니다. 이 예제에서는 start.sh란 스크립트를 내부에서 실행하는데 start.sh를 실행하려면 환경 변수 TMPVAR 설정이 필요하다고 합시다.
우선 ①에서 미리 설정해둬야 하는 환경 변수명을 셸 변수 envname에 대입합니다. 여기서 지정한 TMPVAR이라는 환경 변수가 지정되어 있지 않으면 에러가 발생합니다.
②에서 env 명령어를 사용해서 설정되어 있는 환경 변수를 임시 파일 env.lst에 출력합니다. env 명령어 출력 예는 다음과 같습니다.
$ env
OHOSTNAME=www.example.com
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
...
LOGNAME=park
G_BROKEN_FILENAMES=1
_=/bin/env...
env 명령어 출력 결과는 "환경 변수명=값"처럼 = 기호로 구분됩니다. 환경 변수명은 첫 번째 컬럼에 있는데 이런 텍스트 파일에서 지정한 컬럼값을 추출할 때는 '구분자를 지정해서 n번째 값을 추출'하는 명령어를 사용합니다. 이런 방법은 몇 가지 있는데 여기에서는 cut 명령어를 사용합니다.
cut 명령어는 텍스트 파일에서 어떤 일부분을 추출하는 명령어입니다. -d 옵션으로 구분자를 지정해서 -f 명령어와 이어진 숫자로 추출할 장소를 지정합니다. ②에서 -d "="로 지정해서 =로 나누고 -f 1로 첫 번째 값 즉 설정된 환경 변수명을 추출할 수 있습니다.
③에서 확인하고 싶은 환경 변수명이 정의되어 있는지 확인합니다. grep 명령어는 이미 출력한 환경 변수를 기록한 임시 파일과 비교해서 셸 변수 envname에 정의한 값이 환경 변수로 설정되어 있는지 판별합니다. 여기서 명령어 종료 스테이터스만 사용하므로 grep 명령어 결과를 출력하지 않도록 -q 옵션을 사용합니다.
④에서 grep 명령어 종료 스테이터스 $?를 사용해서 환경 변수가 설정되어 있는지에 따라 분기합니다. grep 명령어로 일치한 줄이 있으면 종료 스테이터스는 0이 되므로 이것은 셸 변수 envname으로 정의된 환경 변수가 설정되어 있다는 뜻입니다. ⑤에서는 환경 변수가 설정되어 있다고 표시하고, 이어서 스크립트 start.sh를 실행합니다. 여기서 이 스크립트는 단순히 [START] start.sh라고 표시하는데 각자 상황에 맞게 수정하면 됩니다.
<주의사항>
test 명령어 빈 문자열인지 확인하는 -z 연산자를 써서 환경 변수값이 빈 문자열인지 확인하는게 일반적입니다.
if [ -z "$TMPVAR" ]; then
echo "환경 변수 TMPVAR는 비었음"
else
echo "환경 변수 TMPVAR는 설정되어 있음"
fi
이 방법은 환경 변수가 미정의인지 아니면 빈 문자열로 설정되었는지 구분할 수 없습니다. 다만 실제로는 큰 차이가 없습니다.
awk 명령어로 =이 구분자인 텍스트 파일에서 첫 번째 컬럼을 추출하려면 구분자 문자열을 지정하는 -F 옵션을 사용합니다.
$ awk-F='{print $1}'
하지만 이 예제에서는 짧고 알기 쉬운 cut 명령어를 사용했습니다.
참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전
'IT 이야기 > Linux 셸 스크립트' 카테고리의 다른 글
[Linux 셸 스크립트] 텍스트 처리 - 071 입력 파일 해시값을 줄마다 추가해서 출력하기 (0) | 2021.04.08 |
---|---|
[Linux 셸 스크립트] 텍스트 처리 - 070 파일 앞머리의 셔뱅(shebang, #!/bin/sh 등)을 추출해서 스크립트에 따라 확장자 붙이기 (0) | 2021.04.07 |
[Linux 셸 스크립트] 텍스트 처리 - 068 ID가 적힌 목록 파일에서 ID를 추출할 때 ID 끝 문자로 정렬하기 (0) | 2021.04.07 |
[Linux 셸 스크립트] 네트워크 - 067 로컬 셸 스크립트 파일을 원격 호스트에서 그대로 실행하기 (0) | 2021.04.07 |
[Linux 셸 스크립트] 네트워크 - 066 IP 주소에 따른 처리 분기를 case문으로 작성하기 (0) | 2021.04.07 |
댓글