shell调用脚本,读取配置文件小demo

功能

实现配置文件的加载功能。脚本目录结构:

./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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章