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脚本却是像我这样的新手和菜鸟的难题.能不能编写得出来是一回事,了不了解又是另一回事.抱着好好学习,天天向上的精神,大家有空就看看吧,没有坏处的.下面来抄 ...
随机推荐
- Markdown语法及使用方法完整手册
欢迎使用 Markdown在线编辑器 MdEditor Markdown是一种轻量级的「标记语言」 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容 ...
- day33 Pyhton 常用模块03
一.正则表达式: 1.元字符 . 匹配除换行符以外的任意字符 \w 匹配字母或数字或下划线 \s 匹配任意的空白符 \d 匹配数字 \n 匹配一个换行符 \t 匹配一个制表符 \b 匹配一个单词的结尾 ...
- swoole一键协程
swoole4.x后支持一键协程 加上后,开启一键协程化后,MySQL.Redis.Curl 等操作会变成异步 IO //此行代码后,文件操作,sleep,Mysqli,PDO,streams等都变成 ...
- spring boot: 用redis的消息订阅功能更新应用内的caffeine本地缓存(spring boot 2.3.2)
一,为什么要更新caffeine缓存? 1,caffeine缓存的优点和缺点 生产环境中,caffeine缓存是我们在应用中使用的本地缓存, 它的优势在于存在于应用内,访问速度最快,通常都不到1ms就 ...
- Android adb实现原理
adb定义: adb(Android Debug Bridge) 安卓调试桥,包含adb client.adb server和adbd三部分. adb client:运行在PC上,即DDMS或者在Wi ...
- 【应用服务 App Service】快速获取DUMP文件(App Service for Windows(.NET/.NET Core))
问题情形 当应用在Azure 应用服务App Service中运行时,有时候出现CPU,Memory很高,但是没有明显的5XX错误和异常日志,有时就是有异常但是也不能明确的指出具体的代码错误.当面临这 ...
- soundPool声音池
soundPool可以同时播放多个声音,但是最好文件不要超过1M,声音只能播放几秒,适合游戏混合音效 public class MainActivity extends AppCompatActivi ...
- day04基本数据类型
内容补充 编译器和解释器:牵扯到编译型语言和解释型语言 编译型语言:JAVA C C# C++ 写好的代码交给编译器,编译器会编译成一个新的文件交给计算机执行 解释型语言:python PHP 写好的 ...
- 通过Relect反射方法创建对象,获得对象的方法,输出对象信息
package reflects; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java. ...
- 稳压二极管、肖特基二极管、静电保护二极管、TVS管
1.稳压二极管 正向导通电压跟普通二级管一样约为0.7v,反向状态下在临界电压之前截止,在达到临界电压的条件下会处于导通的状态,电压也不再升高,所以用在重要元器件上,起到稳压作用. 稳压二极管主要利用 ...