구성 파일 apps.conf에 다음을 정의했습니다.
PORT_INDEX=7
아래와 같이 bash 스크립트에서 이 파일을 실행한 다음 변수 값을 표시합니다 PORT_INDEX
.
. apps.conf
echo $PORT_INDEX
하지만 작동하지 않는 것 같습니다. bash
스크립트의 구성 파일 에서 이 변수에 어떻게 액세스할 수 있나요 ?
답변1
코드에 오타가 있습니다.
구성 파일의 변수 이름이 지정되어 있지만 정의되지 않은 변수를 PORT_INDEX
표시하려고 합니다 .PORT_IXDEX
답변2
다음에서 확장됨제가 댓글에 올렸던 링크...
여기의 이 함수는 사용자가 요청한 변수만 평가합니다.
read_config () { # read_config file.cfg var_name1 var_name2
#
# This function will read key=value pairs from a configfile.
#
# After invoking 'readconfig somefile.cfg my_var',
# you can 'echo "$my_var"' in your script.
#
# ONLY those keys you give as args to the function will be evaluated.
# This is a safeguard against unexpected items in the file.
#
# ref: https://stackoverflow.com/a/20815951
#
# The config-file could look like this:
#-------------------------------------------------------------------------------
# This is my config-file
# ----------------------
# Everything that is not a key=value pair will be ignored. Including this line.
# DO NOT use comments after a key-value pair!
# They will be assigend to your key otherwise.
#
# singlequotes = 'are supported'
# doublequotes = "are supported"
# but = they are optional
#
# this=works
#
# # key = value this will be ignored
#
#-------------------------------------------------------------------------------
shopt -s extglob # needed the "one of these"-match below
local configfile="${1?No configuration file given}"
local keylist="${@:2}" # positional parameters 2 and following
if [[ ! -f "$configfile" ]] ; then
>&2 echo "\"$configfile\" is not a file!"
exit 1
fi
if [[ ! -r "$configfile" ]] ; then
>&2 echo "\"$configfile\" is not readable!"
exit 1
fi
keylist="${keylist// /|}" # this will generate a regex 'one of these'
# lhs : "left hand side" : Everything left of the '='
# rhs : "right hand side": Everything right of the '='
#
# "lhs" will hold the name of the key you want to read.
# The value of "rhs" will be assigned to that key.
while IFS='= ' read -r lhs rhs; do
# IF lhs in keylist
# AND rhs not empty
if [[ "$lhs" =~ ^($keylist)$ ]] && [[ -n $rhs ]]; then
rhs="${rhs%\"*}" # Del opening string quotes
rhs="${rhs#\"*}" # Del closing string quotes
rhs="${rhs%\'*}" # Del opening string quotes
rhs="${rhs#\'*}" # Del closing string quotes
eval $lhs=\"$rhs\" # The magic happens here
fi
# tr used as a safeguard against dos line endings
done <<< $( tr -d '\r' < $configfile )
shopt -u extglob # Switching it back off after use
} # ---------- end of function read_config ----------