UCI shell API使用说明
uci shell接口定义在/lib/functions.sh文件中,参考openwrt官网[OpenWrt Wiki] Configuration in scripts。
1.config_cb()、option_cb()和list_cd()函数
UCI每次解析section时都会调用callback;config_load完成后会生成对config_cb、option_cb和list_cb()的调用。如果在解析每个选项时需要保存一些数据进行操作,需要定义三个config_cb()、option_cb()和list_cb()函数。
使用举例:
●测试脚本
cat test.sh
#! /bin/sh
. /lib/functions.sh
config_cb() {
local type="$1"
local name="$2"
echo "config_cb type= $type"
echo "config_cb name= $name"
# commands to be run for every section
}
option_cb() {
local name="$1"
local value="$2"
echo "option_cb name=: $name"
echo "option_cb value=: $value"
# commands to be run for every option
}
list_cb() {
local name="$1"
local value="$2"
echo "list_cb name=: $name"
echo "list_cb value=: $value"
# commands to be run for every list item
}
config_load network
●network脚本:
cat /etc/config/network
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'auto'
config switch
option name 'switch0'
config interface 'lan'
option ifname 'eth0 eth1'
option force_link '1'
option type 'bridge'
option proto 'static'
option ipaddr '192.168.3.1'
option netmask '255.255.255.0'
option ip6assign '60'
option multicast_querier '0'
option igmp_snooping '0'
option ieee1905managed '1'
config interface 'wan'
option ifname 'eth2'
option proto 'dhcp'
config interface 'wan6'
option ifname 'eth2'
option proto 'dhcpv6'
●测试结果:
./test.sh
config_cb type= interface
config_cb name= loopback
option_cb name=: ifname
option_cb value=: lo
option_cb name=: proto
option_cb value=: static
option_cb name=: ipaddr
option_cb value=: 127.0.0.1
option_cb name=: netmask
option_cb value=: 255.0.0.0
option_cb name=: up
option_cb value=: 1
option_cb name=: device
option_cb value=: lo
config_cb type= globals
config_cb name= globals
option_cb name=: ula_prefix
option_cb value=: auto
config_cb type= switch
config_cb name= cfg033777
option_cb name=: name
option_cb value=: switch0
config_cb type= interface
config_cb name= lan
option_cb name=: force_link
option_cb value=: 1
option_cb name=: type
option_cb value=: bridge
option_cb name=: proto
option_cb value=: static
option_cb name=: ipaddr
option_cb value=: 192.168.3.1
option_cb name=: netmask
option_cb value=: 255.255.255.0
option_cb name=: ip6assign
option_cb value=: 60
option_cb name=: multicast_querier
option_cb value=: 0
option_cb name=: igmp_snooping
option_cb value=: 0
option_cb name=: ieee1905managed
option_cb value=: 1
option_cb name=: up
option_cb value=: 1
option_cb name=: device
option_cb value=: eth0 eth1
option_cb name=: ifname
option_cb value=: br-lan
config_cb type= interface
config_cb name= wan
option_cb name=: ifname
option_cb value=: eth2
option_cb name=: proto
option_cb value=: dhcp
option_cb name=: up
option_cb value=: 1
option_cb name=: device
option_cb value=: eth2
config_cb type= interface
config_cb name= wan6
option_cb name=: ifname
option_cb value=: eth2
option_cb name=: proto
option_cb value=: dhcpv6
config_cb type=
config_cb name=
2.config_load函数:
在执行uci的shell接口的时候,都需要先执行config_load函数将package加载进环境中。
函数格式:config_load <package>
脚本源码:
config_load() {
[ -n "$IPKG_INSTROOT" ] && return 0
uci_load "$@"
}
3.config_foreach函数:
config_foreach基于回调解析的一种方法过程的迭代函数。
格式:config_foreach <callback_func> [<section type>] ]<customer_val>]
callback_func回调函数,section_type配置文件类型,若不设置该参数,则获取脚本所有的类型,customer_val变量可选,将脚本类型赋值到customer_val变量。
脚本源码:
config_foreach() {
local ___function="$1"
[ "$#" -ge 1 ] && shift
local ___type="$1"
[ "$#" -ge 1 ] && shift
local section cfgtype
[ -z "$CONFIG_SECTIONS" ] && return 0
for section in ${CONFIG_SECTIONS}; do
config_get cfgtype "$section" TYPE
[ -n "$___type" -a "x$cfgtype" != "x$___type" ] && continue
eval "$___function \"\$section\" \"\$@\""
done
}
应用举例:
●脚本内容
cat /etc/config/network
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'auto'
config switch
option name 'switch0'
config interface 'lan'
option ifname 'eth0 eth1'
option force_link '1'
option type 'bridge'
option proto 'static'
option ipaddr '192.168.3.1'
option netmask '255.255.255.0'
option ip6assign '60'
option multicast_querier '0'
option igmp_snooping '0'
option ieee1905managed '1'
config interface 'wan'
option ifname 'eth2'
option proto 'dhcp'
config interface 'wan6'
option ifname 'eth2'
option proto 'dhcpv6'
●测试脚本:
#! /bin/sh
. /lib/functions.sh
handle_interface() {
local config="$1"
local custom="$2"
echo "$custom $config"
# run commands for every interface section
}
config_load network
config_foreach handle_interface interface interfacetype:
●执行结果:
interfacetype: loopback
interfacetype: lan
interfacetype: wan
interfacetype: wan6、
4.config_get函数:
格式:config_get <variable> <setction name> <option name> [<default>]
config_get从etction name中获取option name的vlaue保存到variable中,若option name的vlaue存在就返回value,若不存在就返回default。
应用举例1(以/etc/config/network为例说明):
●测试脚本1
#! /bin/sh
. /lib/functions.sh
config_load network
config_get ifacex 'loopback' ipaddr
echo "------- is $ifacex"
●执行结果:------- is 127.0.0.1
●测试脚本2
config_load network
config_get ifacex 'lan' type
echo "------- is $ifacex"
●执行结果------- is bridge
●测试脚本3
config_load wireless
config_get ifacex 'wifi1' type
echo "------- is $ifacex"
●执行结果:------- is qcawificfg80211
应用举例2(以/etc/config/system为例说明)
●测试脚本4
配置文件内容
cat /etc/config/system
config system
option hostname OpenWrt
option timezone UTC
option log_size 64
config timeserver ntp
list server 0.openwrt.pool.ntp.org
list server 1.openwrt.pool.ntp.org
list server 2.openwrt.pool.ntp.org
list server 3.openwrt.pool.ntp.org
option enabled 1
option enable_server 0
脚本:
#! /bin/sh
. /lib/functions.sh
config_load system
config_get ifacex 'ntp' server
echo "------- is $ifacex"
结果:------- is 0.openwrt.pool.ntp.org 1.openwrt.pool.ntp.org 2.openwrt.pool.ntp.org 3.openwrt.pool.ntp.org
5.config_set函数:
config_set将value设置到对象中。
格式:config_set <section> <option> <value>
config_set更改的值仅保存在内存中。对config_get的后续调用将返回更新后的值,底层配置文件不会更改。如果要更改值,需要使用/etc/functions.sh自动包含的/lib/config/uci.sh中的uci_*函数。
6.config_list_foreach函数:
config_list_foreach与config_foreach类似都是以回调解析的一种方法过程迭代,主要用于list的section选项。
函数格式:config_list_foreach <section name> <list name> <handle_back>
应用举例(以/etc/config/system例说明):
●配置文件
cat /etc/config/system
config system
option hostname OpenWrt
option timezone UTC
option log_size 64
config timeserver ntp
list server 0.openwrt.pool.ntp.org
list server 1.openwrt.pool.ntp.org
list server 2.openwrt.pool.ntp.org
list server 3.openwrt.pool.ntp.org
option enabled 1
option enable_server 0
●测试脚本:
#! /bin/sh
. /lib/functions.sh
handle_ntp() {
local value="$1"
echo "$value"
# do something with $value
}
config_load system
config_list_foreach ntp server handle_ntp
●结果
0.openwrt.pool.ntp.org
1.openwrt.pool.ntp.org
2.openwrt.pool.ntp.org
3.openwrt.pool.ntp.org
7.config_get_bool函数:
与config_get功能类似。将返回值转换成bool类型
8.append函数:
格式:append <variable2> <variable1>
variable1的变量是从config_get获取的数据,append就是将variable1的数据保存到variable2变量中
●测试脚本:
从/etc/config/network中保存wifi1的channel、hwmode、htmode的值保存到axx.conf文件
#! /bin/sh
. /lib/functions.sh
config_load wireless
config_get ch 'wifi1' channel
echo "1.-----$ch"
append _buffer "channel $ch"
config_get hwmd 'wifi1' hwmode
echo "2.----$hwmd"
append _buffer "hwmode $hwmd"
config_get htmd 'wifi1' htmode
echo "3.----$htmd"
append _buffer "htmode $htmd"
echo "$_buffer" >> /tmp/axx.conf
●结果:
cat axx.conf
channel auto hwmode 11axg htmode HT40
9.list_contains:
格式:list_contains <variable1> <variable2>
list_contains从左到右将变量variable2的内容从变量variable1的尾部删除。
●脚本源码:
list_contains() {
local var="$1"
local str="$2"
local val
eval "val=\" \${$var} \""
[ "${val%% $str *}" != "$val" ]
}
●应用举例:
#! /bin/sh
test=ssssyyyyxxxxyyyy111
echo "${test%%yy*}"
结果:ssss
文章浏览阅读1.3k次。 --/*-----存储过程 分页处理 孙伟 2005-03-28创建 -------*/--/*----- 对数据进行了2分处理使查询前半部分数据与查询后半部分数据性能相同 -------*/--/*-----存储过程 分页处理 孙伟 2005-04-21修改 添加Distinct查询功能-------*/--/*-----存储过程 分页处理 孙伟 2005-05-18修改 多字段排序规则问题-_top 搭配not in 性能
文章浏览阅读1.5w次,点赞3次,收藏10次。VueUse官方链接一、什么是VueUseVueUse不是Vue.use !!!它是一个基于 Composition API 的实用函数集合,下面是具体的一些用法二、如何引入import { 具体方法 } from ‘@vueuse/core’三、下面来看看一些具体的用法1、useMouse:监听当前鼠标坐标的一个方法,他会实时的获取鼠标的当前的位置2、usePreferredDark:判断用户是否喜欢深色的方法,他会实时的判断用户是否喜欢深色的主题3、useLocalStorage:数据_vueuse/core
文章浏览阅读736次。转自:爱数据LoveD大家好,我是小z,也可以叫我阿粥~今天给大家分享一波统计学重要概念,顺便前排提示文末送书~从高的角度来看,统计学是一种利用数学理论来进行数据分析的技术。象柱状图这种基本的可视化形式,会给你更加全面的信息。但是,通过统计学我们可以以更富有信息驱动力和针对性的方式对数据进行操作。所涉及的数学理论帮助我们形成数据的具体结论,而不仅仅是猜测。利用统计学,我们可以更深入、更细致地观察数..._统计学五大基本原理
文章浏览阅读2.4k次,点赞3次,收藏9次。一、synchronized使用1.1 synchronized介绍在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。synchronized可以修饰普通方法,静态方法和代码块。当synchronize..._synchronized常见使用场景 threadsyntest.new myrunnable3
文章浏览阅读260次。安装下述包:thirftpythirft-saslthirftpure-sasl(卸载sasl,若要用pyhive,sasl轮子安装路径Link)impyla# -*- coding:UTF-8 -*-from impala.dbapi import connect#下述host只是个demo,需填入真实ipconn = connect(host='11.22.33.44', port=21050, auth_mechanism='PLAIN',user='yourusername',pa_python impyla demo
文章浏览阅读280次。错误编译pdo_mysqlphp扩展的操作流程,以及解决错误并成功完成编译pdo_mysql新编译的PHP环境运行项目时报错PHP Fatal error: Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'原因是没有加载pdo_mysql扩展错误配置pdo_mysql及编译cd ext/pdo_mysqlphpize./configure --w..._/usr/local/php7.4.24/ext/pdo_mysql/php_pdo_mysql_int.h:29:11: fatal error: m
文章浏览阅读2k次。构建:从debug换成release:就可以正常运行了_qt安装后构建可以,运行就一直提示程序异常
文章浏览阅读601次。什么是机器学习?简单来说就是让机器帮我们找一个函数,即一个映射。如声音—>文字的语音识别函数自变量可以是向量,矩阵(图像识别),序列输出是数值、图片等课程讲什么?一、监督学习,给定图片人工的告诉机器其类型,训练模型,让机器拥有 f(图片)—>类型 这一函数二、训练模型之前进行Pre-train,让机器学习如何辨别图片这一基本功,因为人工输入图片类型过于繁琐。只需传入大量图片资料即可自动训练。如把图片翻转、变色,询问机器是不是可以..._李宏毅2021机器学习笔记 百度
文章浏览阅读1.7k次。两个map合并成一个map,用insert()函数就可以了,看代码:#include <map>#include <iostream>int main(){ std::map<int, int> v1 = {{1, 1}, {2, 1}, {3, 1}, {4, 1}, {5, 1}}; std::map<int, int> v2 = { {3, 2}, {4, 2}, {5, 2}, {6, 2}, {7_c++ map合并
文章浏览阅读1.3w次,点赞12次,收藏85次。步骤1、2、3、我喜欢一个文件夹下存放多个项目,所以删掉生成的CMakeList.txt、main.c和cmake-build-debug文件。新建一个List目录,并在该目录下新建CMakeList.txt4、创建一个C文件进行测试5、创建好后,提示在List文件夹下的CMakeList.txt添加:include_directories(.)add_executable(List-List01 List01.c) //List是文件夹名称,List01.c是具体文件名称_clion创建c语言项目
文章浏览阅读5k次。再次强调:底下的几篇短文是学习 Linux 的基础文件,这些文件是基础中的基础,如果您能将其中的文件都看完,并且消化过,那么未来在管理 Linux 主机以及架设网站方面,就能够达到『事半功倍』的成效,请不要忽略这部份了!否则,再怎么讨论都是枉然的啦! ^_^第一部份:Linux 的规划与安装Linux 本身虽然具有相当强大的功能,不过,如果不能理解 Linux 的工作能力,那么 Linux 能做的..._鸟哥linux基础篇
文章浏览阅读2.4k次,点赞2次,收藏10次。材质面向摄像机单贴图面向摄像机组合贴图面向摄像机单贴图面向摄像机主要是调用RotateAboutAxis这个材质函数输入旋转轴 001计算旋转角度去除camera的z轴影响算出物体到摄像机的向量归一化后算出夹角FVector::Rotation()函数的内部实现(局部)FRotator R; // Find yaw.R.Yaw = FMath::Atan2(Y,X) * (180.f / PI); // Find pitch.R.Pitch = FMath_ue5 通过材质使面片始终朝向摄像机