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学习的更多相关文章

  1. 转:openwrt中luci学习笔记

    原文地址:openwrt中luci学习笔记 最近在学习OpenWrt,需要在OpenWrt的WEB界面增加内容,本文将讲述修改OpenWrt的过程和其中遇到的问题. 一.WEB界面开发         ...

  2. 【转】Android source build/envsetup.sh学习笔记

    原文网址:http://blog.csdn.net/mliubing2532/article/details/7567164 如果你只需要修改某一个模块的内容,但是却每次都要执行make, 最后等待很 ...

  3. CWMP开源代码研究2——easycwmp安装和学习

    声明:本文是对开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅号:408797506) 本文所有笔记和代码可以到csdn下载:http://download.csdn.n ...

  4. Openwrt LuCI模块练习详细步骤

    前言 又到了成胖子^_^每周一博的时间了.最近在学习openwrt luci方面的知识,为了贯穿整个知识体系,练习题目为: 通过页面配置周期性地往/tmp/addtest文件写入内容和时间戳 1.在w ...

  5. openwrt的默认/etc/config/network文件是如何生成的?

    openwrt的network文件,或者说在/etc/config下的文件,都是动态生成的. 脚本的函数定义在openwrt1407/package/base-files/files/lib/func ...

  6. openwrt procd启动流程和脚本分析

    Linux内核执行start_kernel函数时会调用kernel_init来启动init进程,流程如下图: graph LR A[start_kernel] -->B(rest_init) B ...

  7. Hello Shell

    shell是Linux平台的瑞士军刀,能够自动化完成很多工作.要了解UNIX 系统中可用的 Shell,可以使用 cat /etc/shells 命令.使用 chsh 命令 更改为所列出的任何 She ...

  8. OpenWRT学习笔记-1@WNDR3800

    很久以前买了一台二手wndr3800 放假了刷成op可以一耍.ar71xx,芯片还比较热门. 首先是刷机,准备使用OP CC 15.05 r46767,官方稳定版.把原装系统降级到1.0.0.16,就 ...

  9. sh语法入门学习

    玩linux都知道sh脚本的方便,但如何编写sh脚本却是像我这样的新手和菜鸟的难题.能不能编写得出来是一回事,了不了解又是另一回事.抱着好好学习,天天向上的精神,大家有空就看看吧,没有坏处的.下面来抄 ...

随机推荐

  1. 【组合计数】visit

    题目大意 从 \((0,0)\) 开始,每次只可走上下左右一个单位长度,可走重复路,求第 \(T\) 步正好走到 \((n,m)\) 的方案数. 答案要求对 \(MOD\) 取模,\(MOD\) 保证 ...

  2. 服务器同一个tomcat部署2两个相同的项目

    项目A,B(B 是A 的复制) 若把A,B工程同时部署到tomcat下,会发生只能访问A,B工程中的其中一个,而另一个会出现404错误(或者无法访问),此时可参照如下方法解决: 步骤1:找到工程下的w ...

  3. mac 安装appium

    mocOS 10.15.5 开启方式:设置->默认编辑器->Markdown编辑器

  4. <转>二十问全链路压测干货汇总(上)

    本文转载自:微信公众号-数列科技<二十问全链路压测干货汇总(上)> 最近几年全链路压测无疑成为了一个热门话题,在各个技术峰会上都可以看到它的身影. 一些大型的互联网公司,比如阿里巴巴.京东 ...

  5. Helium文档11-WebUI自动化-attach_file上传文件或图片

    前言 attach_file关键字根据官方介绍的作用是上传文件 入参介绍 def attach_file(file_path, to=None): """ :param ...

  6. 自学Python可以吗?怎样从入门到大师?我写这篇文章告诉你

    前言 很多粉丝朋友问我该如何去学习爬虫.学习Python.自学能找到工作吗?等一系列的问题.今天我就来回答一下大家. 第一点 确定好方向与目标 当决定踏入这个行业那一刻起,我想每一个人都爱已经准备投身 ...

  7. java8中哪个类用到了开放地址解决冲突

    hreadlocalmap使用开放定址法解决haah冲突,hashmap使用链地址法解决hash冲突

  8. 解放双手,不写SQL!一个开源mybatis神器

    什么是通用 Mapper? 它是一个可以方便的使用 Mybatis 进行单表的增删改查优秀开源产品.它使用拦截器来实现具体的执行 Sql,完全使用原生的 Mybatis 进行操作.在 Github 上 ...

  9. CodeForces 1327F AND Segments

    题意 给三个整数 \(n,k,m\) 和 \(m\) 个限制 \((l_i,r_i,x_i)\),求有多少个长度为 \(n\) 的序列 \(a\) 满足: 对于 \(1\leq i\leq n\) 有 ...

  10. JavaMail 发送邮件出现 Connection reset 问题

    问题描述 使用 java mail 发送邮件的时候,申请的 163 邮箱作为发件箱,然无论如何配置,均出现 Connection reset,无法正常发送邮件. Exception in thread ...