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脚本却是像我这样的新手和菜鸟的难题.能不能编写得出来是一回事,了不了解又是另一回事.抱着好好学习,天天向上的精神,大家有空就看看吧,没有坏处的.下面来抄 ...
随机推荐
- java基础语句翻译
public static void main(String[] args) { System.out.println("人生中的第一个代码-----"); } } package ...
- github 如何解决error: failed to push some refs
错误 error: failed to push some refs to 'https://github.com/whitclass/scrapy-spider.git' hint: Updates ...
- jmeter_04_常用取样器
目录 常用取样器详解 http取样器 1.1 基本配置 1.2 高级配置 jdbc取样器 2.1 JDBC Connection Configuration 2.1.1 **Variable Name ...
- GeoServer发布shapfile字段名和值乱码问题解决
摘要: 网上说了一大堆方法又是转格式咯又是改源代码了,修改很简单: 修改Styles下的你的style: Xml代码 修改Stores下你的图层的属性,设置 DBF charset为GBK 以上设置G ...
- C# URL编码
#region URL编码 /// <summary> /// URL编码 /// </summary> /// <param name="str"& ...
- C# 将Excel里面的数据填充到DataSet中
/// <summary> /// 将Excel表里的数据填充到DataSet中 /// </summary> /// <param name="filenam ...
- 千万不要往 Shell 里粘贴命令!
对于用惯了 IDE 的程序员来说,在终端里敲命令可能没那么顺手,也记不住那么多复杂的命令.比较偷懒的做法就是网上搜相关的命令,复制到剪贴板往命令行窗口里一贴,完事! 但是这么做有很大的风险,为什么呢? ...
- abstract关键字的说法
含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象.含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必 ...
- 在WPF中一种较好的绑定Enums数据方法
引言 在你使用wpf应用程序开发的时候,是否需要进行数据绑定到Enum数据呢?在这篇文章中,我将向你展示在WPF中处理Enum数据绑定的方法. 假设存在一个这样的Enum数据的定义,具体内容如下文代码 ...
- java关键字之abstract
Java 允许类,借口或成员方法具有抽象属性. abstract 修饰的类叫做抽象类,该类不能被实例化. abstract 修饰的方法叫抽象方法,抽象方法只有声明部分,没有具体的方法体. 接口总是 ...