본문 바로가기
의지박약/DevOps

[Shell Script] 쉘 스크립트에서 config.ini 파일 읽고 쓰기 (feat. konfig)

by 병진들 2021. 9. 8.

서비스를 하려고 보면 각 환경, 프로젝트마다 설정을 위한 값이 유동적이기 때문에 config파일을 읽어오는 것은 중요하다.

python 프로젝트 내부에서는 config.py를 따로 두고 konfig 라는 라이브러리를 따로 설치해서 ini파일을 읽어주기도 한다.

 

이번 포스팅의 목적은 한개의 config.ini 파일로 python 프로젝트에서도 활용하고 shell script에서도 활용하기 위함이다.

 

# 밑에서 계속 사용하게 될 config.ini 파일 내용

# config.ini

[server]
HOST	= 0.0.0.0
PORT	= 8889

[db]
USER	= kbj
PW	= 1234
ADD	= 192.168.0.1
PORT	= 2345
NAME	= kbjdb

[file]
STORAGE	= /xedm_storage/

 

1. Shell Script에서 사용 방법(awk)

먼저 Shell Script에서 config.ini 파일을 읽어오는 방법이다.

# shellscript.sh

# 현재 경로
CURRENT_PATH=$(pwd)

# config파일 경로
CONFIG_FILE=${CURRENT_PATH}/config.ini

shellscript의 현재 폴더 경로를 저장해두고 같은 폴더에 위치한 config.ini 파일의 경로또한 환경변수로 저장해준다.

 

 

Shell Script에서 config.ini 파일의 내부 변수를 읽어오는 명령어는 awk 이다.

아래와 같은 config.ini 파일에서 STORAGE 변수에 저장된 값을 읽어오는 방법이다.

# shellscript.sh
A=$(awk '/^STORAGE/{print $0}' ${CONFIG_FILE})

awk명령어를 사용하여 STORAGE로 시작하는 문장 자체(line)를 읽어와 저장하는 것인데, 

print 옵션의 $0, $1, $2, ... 에 따라서 읽어오는 부분이 다르다.

 

$0은 'STORAGE'라는 단어가 있는 문장 전체를 가져온다. 

config.ini 파일에서는 'STORAGE = /xedm_storage/' 전체를 가져와서 A에 저장하게 된다.

 

A ($0) STORAGE = /xedm_storage/

 

$1 부터는 문장의 탭(tap) 또는 공백(space) 별로 끊어서 인식한다. 

# shellscript.sh

B=$(awk '/^STORAGE/{print $1}' ${CONFIG_FILE})
C=$(awk '/^STORAGE/{print $2}' ${CONFIG_FILE})
D=$(awk '/^STORAGE/{print $3}' ${CONFIG_FILE})
B ($1) STORAGE
C ($2) =
D ($3) /xedm_storage/

이런식으로 $의 값에따라 변수에 저장하는 값을 지정할 수 있다.

일반적으로 우리가 config파일의 값을 작성할때에는, $3 부분이 변경이 일어나는 부분이므로 $3 을 주로 사용해주면 된다.

 

중복되는 환경변수명 처리

여기서 궁금한점은 일반적으로 .ini파일을 사용할때 우리는 대괄호[]를 사용하여 똑같은 환경변수명이어도 세부적으로 구분한다.

예를들어 Server에도 PORT가 있을 것이고, Database에도 PORT가 있을것이기 때문에...!

대괄호[]로 구분된 ini파일을 읽는 방법awk 명령어를 조금 바꿔주면 된다.

# shellscript.sh

# 중복 변수 활용 테스트
sport=$(awk '/^\[server]/{f=1} f==1&&/^PORT/{print $3;exit}' ${CONFIG_FILE})
dport=$(awk '/^\[db]/{f=1} f==1&&/^PORT/{print $3;exit}' ${CONFIG_FILE})

똑같은 환경변수 'PORT'일지라도, server냐 db냐에 따라 다른 경우 위와같이 처리해 주면 된다.

 

한가지 주의할 점은 conf.ini 파일 내부 값(value)에 따음표 또는 큰따음표("") 를 사용하면 안된다.

 

 

2. Python에서 사용방법(konfig)

konfig는 .ini 파일을 python에서 편하게 읽고 사용할 수 있게 해주는 라이브러리이다.

설치 방법은 pip install konfig 로 간단하다.

# config.py
import konfig

conf = konfig.Config(CONFIG_PATH)

storage = conf.get_map("file")
UPLOAD_DIRECTORY = storage['STORAGE'] # /xedm_storage/

먼저 conf.get_map() 함수를 사용하여 .ini 파일 내부의 []를 읽어온 후, storage = conf.get_map("file")

해당 대괄호 내부에 있는 환경변수들을 사용해주면 된다. UPLOAD_DIRECTORY = storage['STORAGE']

 

 

# 전체 소스코드

# shellscript.sh
# sed -i -e 's/\r$//' shellscript_test.sh -> 윈도우에서 작업하면 \r 같은 문자가 들어와서 제거

# 현재 경로
CURRENT_PATH=$(pwd)

# config파일 경로
CONFIG_FILE=${CURRENT_PATH}/conf.ini

# awk 명령어 테스트
A=$(awk '/^STORAGE/{print $0}' ${CONFIG_FILE})
B=$(awk '/^STORAGE/{print $1}' ${CONFIG_FILE})
C=$(awk '/^STORAGE/{print $2}' ${CONFIG_FILE})
D=$(awk '/^STORAGE/{print $3}' ${CONFIG_FILE})

# 중복 변수 활용 테스트
sport=$(awk '/^\[server]/{f=1} f==1&&/^PORT/{print $3;exit}' ${CONFIG_FILE})
dport=$(awk '/^\[db]/{f=1} f==1&&/^PORT/{print $3;exit}' ${CONFIG_FILE})

echo ${A}
echo ${B}
echo ${C}
echo ${D}

echo "server PORT is $sport and DB PORT is $dport"

 

 

실행 결과

 

 


ref.

https://stackoverflow.com/questions/22683269/how-to-parse-a-config-file-conf-in-shell-script

댓글