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