功能
實現配置文件的加載功能。腳本目錄結構:
./parent
./sh
start.sh
config.sh
./config
config.properties
start.sh是啓動腳本。config.sh是讀取配置文件腳本。config.properties是配置文件。配置文件可能有多個,這裏只用一個做demo。
運行start.sh,會先加載配置文件的內容作爲缺省默認值。之後解析命令行參數,覆蓋配置文件中的默認值。
路徑定位
當前路徑定位
CURRENT_DIR=$(pwd)
echo ${CURRENT_DIR}
這種方式是基於運行命令的位置定位絕對路徑。只有cd到腳本的路徑下,或指定的路徑下才會定位成功。
例如在上一級目錄運行:source ./sh/start.sh,那麼CURRENT_DIR就是:parent 路徑。
腳本路徑定位
CURRENT_PATH=`dirname "$0"`
CURRENT_PATH=`cd "$CURRENT_PATH";pwd`
dirname命令:去掉路徑的最後一級。比如dirname “/d/workroom/workspace”,輸出結果爲:/d/workroom
$0:是當前腳本的名字。
合起來就是當前腳本所在的路徑。
配置文件路徑:
CONFIG_FILE=${CURRENT_PATH}/config/config.properties
文件解析
readFromConfig() {
local key=$1
local defaultValue=$2
local configFile=$3
local value=`sed -n "s/^[ ]*${key}[ ]*=\([^#]*\).*$/\1/p" "${configFile}" | sed "s/^ *//;s/ *$//" | tail -n 1`
[ -z "$value" ] && echo "$defaultValue" || echo "$value"
}
遍歷配置文件,過濾出key=value格式的配置。忽略掉#開頭的註釋信息。
value數據trim操作。
如果有多條配置,只取一條。
如果沒有配置,則返回默認值。
參數解析
固定位置
格式:start.sh arg1 arg2 arg3
可以通過$1,$2,$3獲取配置信息。
帶參數名配置
格式:start.sh -b broke -t topic -o offset
採用getopts解析參數。參數名必須爲一個字母,可以有參數值,也可以沒有參數值。
while getopts 'b:t:0:' OPT
do
case $OPT in
b) echo "-b param value :${OPTARG}";;
t) echo "-t param value :${OPTARG}";;
o) echo "-o param value :${OPTARG}";;
?) echo "unknow param :${OPTARG}";;
esac
done
源碼
start.sh
#!/bin/bash
BIN_PATH=`dirname "$0"`
BIN_PATH=`cd "${BIN_PATH}";pwd`
source "${BIN_PATH}/config.sh"
usage() {
echo "param error!"
echo "usage: start.sh [-b broke] [-t topic] [-o offset]"
}
while getopts 'b:t:o:' OPT
do
case $OPT in
b) BROKE_PARAM=${OPTARG};;
t) TOPIC_PARAM=${OPTARG};;
o) OFFSET_PARAM=${OPTARG};;
?) echo "unknow param :${OPTARG}";;
esac
done
if [ -z $BROKE_PARAM ]; then
BROKE_PARAM=${BROKE_CONIG}
fi
if [ -z $TOPIC_PARAM ]; then
TOPIC_PARAM=${TOPIC_CONIG}
fi
if [ -z $OFFSET_PARAM ]; then
OFFSET_PARAM=${OFFSET_CONIG}
fi
config.sh
#!/bin/bash
bin=`dirname "$0"`
bin=`cd "${bin}";pwd`
config_path=${bin}/config
echo "shell path:$0, config file path: ${config_path}"
CONFIG_FILE=${config_path}/config.properties
KEY_BROKE_PARAM="broke.param"
KEY_TOPIC_PARAM="topic.param"
KEY_OFFSET_PARAM="offset.param"
readFromConfig() {
local key=$1
local defaultValue=$2
local configFile=$3
local value=`sed -n "s/^[ ]*${key}[ ]*=\([^#]*\).*$/\1/p" "${configFile}" | sed "s/^ *//;s/ *$//" | tail -n 1`
[ -z "$value" ] && echo "$defaultValue" || echo "$value"
}
BROKE_PARAM=$(readFromConfig ${KEY_BROKE_PARAM} "" "${CONFIG_FILE}")
TOPIC_PARAM=$(readFromConfig ${KEY_TOPIC_PARAM} "" "${CONFIG_FILE}")
OFFSET_PARAM=$(readFromConfig ${KEY_OFFSET_PARAM} "" "${CONFIG_FILE}")
config/config.properties
broke.param=localhost:1000
topic.param=myTopic
offset.param=10001