功能
实现配置文件的加载功能。脚本目录结构:
./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