Configration in script(uci 脚本使用bug,以及API分析)

BUG: config_load之后,调用uci delete或者uci set xxx.xxx.xxx='',再度掉用config_load,之后通过config_get读取出来的值将会出错,delete之后不使用commit

解决方法1:使用API函数config_unset或者config_set

解决方法2:

config_clear() {

local SECTION="$1"

#遍历每一项option,并将其unset

for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \

sed -e 's/\(.*\)=.*$/\1/'` ; do

unset $oldvar

done

}

config () {

local cfgtype="$1"

local name="$2"

config_clear $name

export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=$(($CONFIG_NUM_SECTIONS + 1))

name="${name:-cfg$CONFIG_NUM_SECTIONS}"

append CONFIG_SECTIONS "$name"

[ -n "$NO_CALLBACK" ] || config_cb "$cfgtype" "$name"

export ${NO_EXPORT:+-n} CONFIG_SECTION="$name"

export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_TYPE=$cfgtype"

}



在调用api时,首先我们需要调用config_load

config_load() {

[ -n "$IPKG_INSTROOT" ] && return 0

uci_load "$@"

}

uci_load() {

local PACKAGE="$1"

local DATA

local RET

local VAR

_C=0

if [ -z "$CONFIG_APPEND" ]; then

for VAR in $CONFIG_LIST_STATE; do

export ${NO_EXPORT:+-n} CONFIG_${VAR}=

export ${NO_EXPORT:+-n} CONFIG_${VAR}_LENGTH=

done

export ${NO_EXPORT:+-n} CONFIG_LIST_STATE=

export ${NO_EXPORT:+-n} CONFIG_SECTIONS=

export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=0

export ${NO_EXPORT:+-n} CONFIG_SECTION=

fi

DATA="$(/sbin/uci ${UCI_CONFIG_DIR:+-c $UCI_CONFIG_DIR} ${LOAD_STATE:+-P /var/state} -S -n export "$PACKAGE" 2>/dev/null)"

RET="$?"

[ "$RET" != 0 -o -z "$DATA" ] || eval "$DATA"

unset DATA

${CONFIG_SECTION:+config_cb}

return "$RET"

}

1、首先通过uci export $PACKAGE 获取配置文件的内容(其他参数就不一一简绍了,具体查看uci --help)

package xxx

config xxx xxx

option xxx xxx

list      xxx  xxx

2、之后eval "$DATA",将package config option替换成函数(这一步是很让我很惊艳的用法,得向大牛学习)

package() {

return 0

}

config () {

local cfgtype="$1"

local name="$2"

export ${NO_EXPORT:+-n} CONFIG_NUM_SECTIONS=$(($CONFIG_NUM_SECTIONS + 1))

name="${name:-cfg$CONFIG_NUM_SECTIONS}"

append CONFIG_SECTIONS "$name"

[ -n "$NO_CALLBACK" ] || config_cb "$cfgtype" "$name"

export ${NO_EXPORT:+-n} CONFIG_SECTION="$name"

export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_TYPE=$cfgtype"

}

option () {

local varname="$1"; shift

local value="$*"

export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_${varname}=$value"

[ -n "$NO_CALLBACK" ] || option_cb "$varname" "$*"

}

list() {

local varname="$1"; shift

local value="$*"

local len

config_get len "$CONFIG_SECTION" "${varname}_LENGTH" 0

[ $len = 0 ] && append CONFIG_LIST_STATE "${CONFIG_SECTION}_${varname}"

len=$(($len + 1))

config_set "$CONFIG_SECTION" "${varname}_ITEM$len" "$value"

config_set "$CONFIG_SECTION" "${varname}_LENGTH" "$len"

append "CONFIG_${CONFIG_SECTION}_${varname}" "$value" "$LIST_SEP"

list_cb "$varname" "$*"

}

3、通过这四个函数将每一项配置项设置到环境变量当中

(bug出现原因:当设入环境变量后,通过uci delete或uci set 删除只会操作换存,在调用config_load 因为option项不存在了,则不会在度设置到环境变量中,因此还是删除之前的值,而不是空)

4、之后的config_get之类的函数就是获取环境变量的值


for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \

sed -e 's/\(.*\)=.*$/\1/'` ; do

for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \

sed -e 's/\(.*\)=.*$/\1/'` ; do

for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \

sed -e 's/\(.*\)=.*$/\1/'` ; do

for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \

sed -e 's/\(.*\)=.*$/\1/'` ; do

for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \

sed -e 's/\(.*\)=.*$/\1/'` ; do

for oldvar in `set | grep ^CONFIG_${SECTION:+${SECTION}_} | \

sed -e 's/\(.*\)=.*$/\1/'` ; do

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容