在 functions.sh 中,使用 option() 来获得 option 配置的值;使用 config_get() 将某个 section 的 option 值赋值给一个变量。下面看具体分析。
先来看 option() ,定义如下:
[Bash shell] 纯文本查看 复制代码 option () {
local varname="$1"; shift
local value="$*"
export ${NO_EXPORT:+-n} "CONFIG_${CONFIG_SECTION}_${varname}=$value"
[ -n "$NO_CALLBACK" ] || option_cb "$varname" "$*"
}
为了便于分析,以 network 中的配置语句为例:
- config interface 'lan'
- option ifname 'eth0'
复制代码
按照上面代码,varname 的值为 ifname ;value 的值为 eth0。
接着将 value 赋值到变量 CONFIG_${CONFIG_SECTION}_${varname} 中,按照上面给出的配置例子,该变量展开就是 CONFIG_lan_ifname 。
option() 代码中最后一句是判断是否自定义了回调函数 option_cb,如果没有定义,它就不起什么作用。
接着看 config_get() 函数,定义如下:
[Bash shell] 纯文本查看 复制代码 # config_get <variable> <section> <option> [<default>]
# config_get <section> <option>
config_get() {
case "$3" in
"") eval echo "\${CONFIG_${1}_${2}:-\${4}}";;
*) eval export ${NO_EXPORT:+-n} -- "${1}=\${CONFIG_${2}_${3}:-\${4}}";;
esac
}
该函数至少需要接 3 个参数。如注释中所示,第 2 个参数 <section> 是 section 名,如上面的 lan;第 3 个参数 <option> 是 option 名,如上面中的 ifname;第 1 个参数 <variable> 是 ifname 的值。下面用一段测试代码来演示:
[Bash shell] 纯文本查看 复制代码 #!/bin/sh
. /lib/functions.sh
config_load network
config="lan"
config_get ipa "$config" ipaddr
echo $ipa
对于 lan 这个 section 的配置为:
代码输出结果为 192.168.2.1,函数使用正确。
为什么可以只通过 ${CONFIG_${2}_${3} 就能得到 option 里的值,并赋予变量 ${1} 中?答案是,早在 option() 函数里已经获得了 ${CONFIG_${2}_${3} 这个的定义,因此他不会去选择 ${4} 。
|