openwrt——preinit.sh学习
boot_hook_init() {
local hook="${1}_hook"
export -n "PI_STACK_LIST=${PI_STACK_LIST:+$PI_STACK_LIST }$1"
export -n "$hook="
echo $PI_STACK_LIST
}
1.export -n 和 local 和 export
进行一下实验:
test.sh
export AA=11
export -n BB=22 func()
{
local CC=33
echo $CC
} echo $AA
echo $BB
echo $CC func
./test2.sh
test2.sh
echo "-----test2.sh-------"
echo $AA
echo $BB
echo $CC
运行:
11
22 33
------test2.sh------
11
得出结论:
local 只能在函数中定义变量,作用域为本函数
export 定义环境变量,作用域为本文件和其他文件
export -n 作用域为本文件
2.使用export 和 变量的一般定义
VAR1=aaa
$VAR1=bbb # n
export $VAR=bbb # y eval "echo \$$VAR" # --> echo $aaa ---> echo bbb
使用export可以先解引用,再定义。
3.
local hook="${1}_hook${PI_HOOK_SPLICE:+_splice}"
当 PI_HOOK_SPLICE为空
${PI_HOOK_SPLICE:+_splice} 返回空
当PI_HOOK_SPLICE非空
${PI_HOOK_SPLICE:+_splice}返回_splice
相关知识
${var:-string} -- 如果${var}为空,用string替换${var:-string},否则使用${var}替换
${var:=string} -- 如果${var}为空,用string替换${var:=string},并且${var}赋值为string,否则同上
${var:+string} -- 如果${var}不为空,则用string替换${var:+string},否则同上(也就是空)
${var:?string} -- 如果${var}为空,报错并退出程序(命令。。。),否则${var}替换${var:?string}
4. 学习脚本
boot_hook_init() {
local hook="${1}_hook"
export -n "PI_STACK_LIST=${PI_STACK_LIST:+$PI_STACK_LIST }$1" # PI_STACK_LIST 存储标签
export -n "$hook=" # hook 存储函数名,保证hook为空
}
boot_hook_add() {
local hook="${1}_hook${PI_HOOK_SPLICE:+_splice}"
local func="${2}"
[ -n "$func" ] && {
local v; eval "v=\$$hook"
export -n "$hook=${v:+$v }$func" # 将新的函数名添加到 hook
}
}
boot_hook_shift() {
local hook="${1}_hook"
local rvar="${2}"
local v; eval "v=\$$hook"
[ -n "$v" ] && {
local first="${v%% *}"
# 如果hook有多个函数名,则hook向后偏移
[ "$v" != "${v#* }" ] && \
export -n "$hook=${v#* }" || \
export -n "$hook="
export -n "$rvar=$first" # 将第一个函数名返回
return 0
}
return 1
}
boot_run_hook() {
local hook="$1"
local func
while boot_hook_shift "$hook" func; do
local ran; eval "ran=\$PI_RAN_$func"
[ -n "$ran" ] || { # 如果本函数从未执行过,则执行
export -n "PI_RAN_$func=1"
$func "$1" "$2"
}
done
}
脚本使用
. preinit.sh boot_hook_init main1
boot_hook_init main2 func1(){
echo "func1"
}
func2(){
echo "func2"
}
func3(){
echo "func3"
} boot_hook_add main1 func1
boot_hook_add main1 func2
boot_hook_add main2 func3
boot_run_hook main1
boot_run_hook main2
openwrt——preinit.sh学习的更多相关文章
- 转:openwrt中luci学习笔记
原文地址:openwrt中luci学习笔记 最近在学习OpenWrt,需要在OpenWrt的WEB界面增加内容,本文将讲述修改OpenWrt的过程和其中遇到的问题. 一.WEB界面开发 ...
- 【转】Android source build/envsetup.sh学习笔记
原文网址:http://blog.csdn.net/mliubing2532/article/details/7567164 如果你只需要修改某一个模块的内容,但是却每次都要执行make, 最后等待很 ...
- CWMP开源代码研究2——easycwmp安装和学习
声明:本文是对开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅号:408797506) 本文所有笔记和代码可以到csdn下载:http://download.csdn.n ...
- Openwrt LuCI模块练习详细步骤
前言 又到了成胖子^_^每周一博的时间了.最近在学习openwrt luci方面的知识,为了贯穿整个知识体系,练习题目为: 通过页面配置周期性地往/tmp/addtest文件写入内容和时间戳 1.在w ...
- openwrt的默认/etc/config/network文件是如何生成的?
openwrt的network文件,或者说在/etc/config下的文件,都是动态生成的. 脚本的函数定义在openwrt1407/package/base-files/files/lib/func ...
- openwrt procd启动流程和脚本分析
Linux内核执行start_kernel函数时会调用kernel_init来启动init进程,流程如下图: graph LR A[start_kernel] -->B(rest_init) B ...
- Hello Shell
shell是Linux平台的瑞士军刀,能够自动化完成很多工作.要了解UNIX 系统中可用的 Shell,可以使用 cat /etc/shells 命令.使用 chsh 命令 更改为所列出的任何 She ...
- OpenWRT学习笔记-1@WNDR3800
很久以前买了一台二手wndr3800 放假了刷成op可以一耍.ar71xx,芯片还比较热门. 首先是刷机,准备使用OP CC 15.05 r46767,官方稳定版.把原装系统降级到1.0.0.16,就 ...
- sh语法入门学习
玩linux都知道sh脚本的方便,但如何编写sh脚本却是像我这样的新手和菜鸟的难题.能不能编写得出来是一回事,了不了解又是另一回事.抱着好好学习,天天向上的精神,大家有空就看看吧,没有坏处的.下面来抄 ...
随机推荐
- 游戏2048的核心算法c#版本的实现
接触游戏有一段时间了,也写了一些东西,效果还不错,今天没事,我就把2048 c# 版本的实现贴出来,代码已经测试过,可以正常.完美运行.当然了,在网上有很多有关2048的实现方法,但是没有提出到类里面 ...
- FY2E HDF格式数据处理绘图
圆盘标称投影数据时静止气象卫星常见的数据产品,比如FY2E静止气象卫星就有很多这样的产品(可以从国家卫星气象中心网站上下载).所谓的圆盘标称投影就是Geostationary投影,主要的投影参数有中央 ...
- centos8上安装mysql8
一,下载并解压mysql8 1,mysql官网 https://www.mysql.com/ 2,下载到source目录 [root@yjweb source]# wget https://cdn.m ...
- vscode配置python调试仍然直接输出
工作目录不能放在python的安装目录下
- soct的创建方法
服务器端:ServerSocket提供的实例 ServerSocket server = new ServerSocket(端口号) 客户端:Socket提供的实例 Socket client = ...
- MySQL全面瓦解:安装部署与准备
下载与安装 互联网高速时代下,我们的生活发生了巨大的变化,从购物(淘宝.京东),出行(滴滴.快狗),支付(支付宝.微信)等,遍及我们生活的方方面面,我们使用这些系统和应用的时候,会在上面获取.存储大量 ...
- js逻辑程序
JavaScript 是 Web 的编程语言. 所有现代的 HTML 页面都使用 JavaScript. JavaScript 非常容易学. 本教程将教你学习从初级到高级 JavaScript 知识. ...
- 求职时这样回答问题你就输了!来自IT类面试官视角的深度解读
摘要:在IT工程师准备写简历时,经常会遇到这些令人头疼的问题:应届生没有实践经验:不确定哪些信息该写不该写:不知道如何在简历上展现自己的优势:不知道如何编写项目经验一栏:为了高大上写上了自己不熟悉的技 ...
- List集合,对象根据某个相同的属性,合并另外属性
描述及实现: 1.List中有 Modular字段值有重复一样的2.Modular字段一样的话去重并且OrderAmount相加 HashMap<String,DataReport> te ...
- git 移除远程仓库关联
1 git remote rm origin // 移除本地关联 2 git remote add origin git@github.com/example.git // 添加线上仓库 3 git ...