=Start=
缘由:
项目需要。
内容:
0.Lua是什么?
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
1.Lua的安装
curl -R -O http://www.lua.org/ftp/lua-5.3.2.tar.gz tar zxf lua-5.3.2.tar.gz cd lua-5.3.2 # Linux make linux sudo make install # Mac make macosx sudo make install
2.Lua的语法
01.Lua 是一个区分大小写的编程语言。因此在 Lua 中 CrazyOf 与 crazyof 是两个不同的标识符。
02.Lua的注释
单行注释 -- 两个减号开头的是单行注释 多行注释 --[[ 这里是多行注释 这里是多行注释 --]]
03.Lua的变量
Lua 的变量有三种类型:全局变量、局部变量、表中的域。
函数外的变量默认为全局变量,除非用 local 显示声明(在默认情况下,变量总是认为是全局的)。函数内变量与函数的参数默认为局部变量。
局部变量的作用域为从声明位置开始到所在语句块结束(或者是直到下一个同名局部变量的声明)。
变量的默认值均为 nil。
全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。
如果你想删除一个全局变量,只需要将变量赋值为nil。这样变量就好像从没被使用过一样。换句话说, 当且仅当一个变量不等于nil时,这个变量即存在。
04.Lua 的数据类型
Lua是动态类型语言,变量不要类型定义,只需要为变量赋值。值可以存储在变量中,作为参数传递或结果返回。
Lua中有8个基本类型,分别为:nil、boolean、number、string、userdata、function、thread和table。我们可以使用type函数测试给定变量或者值的类型。
nil # nil类型表示一种没有任何有效值,它只有一个值即nil;对于全局变量和 table,nil 还有一个"删除"作用 boolean # true / false number # 双精度 string # 单引号、双引号、2个方括号 userdata # 一种用户自定义数据 function # 函数 thread # table # Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。
05.Lua 循环
Lua 语言提供了以下几种循环处理方式:
while循环:在条件为 true 时,让程序重复地执行某些语句。执行语句前会先检查条件是否为 true。
for循环:重复执行指定语句,重复次数可在 for 语句中控制。
repeat…until循环:重复执行循环,直到指定的条件为真时为止。
while(condition) do statements end for var=first, last, step do statements end for i, v in ipairs(a) do print(i, v) end for k, v in pairs(a) do print(k, v) end repeat statements while( condition )
06.Lua 的控制结构
if语句
if…else语句
if嵌套语句
控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,true 和非nil为真。
if(布尔表达式) then --[ 在布尔表达式为 true 时执行的语句 --] end if(布尔表达式) then --[ 在布尔表达式为 true 时执行的语句 --] else --[ 在布尔表达式为 false 时执行的语句 --] end if( 布尔表达式 1) then --[ 在布尔表达式 1 为 true 时执行该语句块 --] else if( 布尔表达式 2) --[ 在布尔表达式 2 为 true 时执行该语句块 --] else if( 布尔表达式 3) --[ 在布尔表达式 3 为 true 时执行该语句块 --] else --[ 如果以上布尔表达式都不为 true 则执行该语句块 --] end
07.Lua 函数定义
Lua 编程语言函数定义格式如下:
-- Lua 编程语言函数定义格式如下: [local] function function_name( argument1, argument2, argument3..., argumentn) function_body return result_params_comma_separated end
可变参数
Lua函数可以接受可变数目的参数,和C语言类似在函数参数列表中使用三点(…)表示函数有可变的参数。Lua将函数的参数放在一个叫arg的表中,#arg 表示传入参数的个数。
例如,我们计算几个数的平均值:
function average(...) result = 0 local arg={...} for i,v in ipairs(arg) do result = result + v end print("总共传入 " .. #arg .. " 个数") return result/#arg end print("平均值为", average(10,5,3,4,5,6))
多返回值
在Lua函数中,在return后列出要返回的值的列表即可返回多值。
08.Lua 运算符
运算符是一个特殊的符号,用于告诉解释器执行特定的数学或逻辑运算。Lua提供了以下几种运算符类型:
算术运算符(加减乘除、取余、幂、负号)
关系运算符(不等于 ~=)
逻辑运算符(and / or / not)
其他运算符([..]连接两个字符串,[#]返回字符串或表的长度)
09.Lua 字符串
Lua 中的字符串或串(String)是由数字、字母、下划线组成的一串字符。Lua 语言中字符串可以使用以下三种方式来表示:
单引号间的一串字符
双引号间的一串字符
[[和]]间的一串字符 #一般用于表示多行字符串
各种字符串操作以及对应的内置函数(string.upper(str)
string.lower(str)
string.reverse(str)
string.strfind (str, substr, [init, [end]])
string.gsub(mainString, findString, replaceString, num)
string.format(…))。
0x.Lua 中的table
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数字、字典等。
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。
常用的table操作:
- table.concat(table [, step [, start [, end]]]) # 用sep符号连接table元素
- table.insert(table, [pos,] value) # 在table中的指定位置进行插入
- table.remove(table [, pos]) # 删除table中指定位置的元素
- table.sort(table [, comp]) # 对给定的table进行升序排序
对Lua中的table不太理解的地方:
3.Lua的应用
- 游戏开发
- 独立应用脚本
- 扩展和插件如:Nmap / Wireshark / …
- Lua+Nginx组合:WAF / OpenResty / …
参考链接:
Lua教程
http://coolshell.cn/articles/10739.html
http://www.runoob.com/lua/lua-tutorial.html
http://www.lua.org/pil/1.html
http://wiki.jikexueyuan.com/project/lua/
https://www.ttlsa.com/lua/
https://wizardforcel.gitbooks.io/w3school-lua/content/
https://zh.wikipedia.org/zh-cn/Lua
http://www.phailed.me/2011/02/learn-lua-the-hard-way-1/
Awesome Lua
https://github.com/LewisJEllis/awesome-lua
https://github.com/forhappy/awesome-lua
Nginx和Lua
https://github.com/openresty/lua-nginx-module
https://openresty.org/download/agentzh-nginx-tutorials-zhcn.html
http://huoding.com/2012/08/31/156
http://wulijun.github.io/2012/09/04/nginx-lua.html
OpenResty
https://moonbingbing.gitbooks.io/openresty-best-practices/content/ngx_lua/lua-limit.html
https://www.centos.bz/2012/12/openresty-nginx-block-cc-attack-deploy/
=END=
《 “Lua的简单学习” 》 有 8 条评论
对于文中「对Lua中的table不太理解的地方」的解释为:
在 Lua 中,数组下标从 1 开始计数。在初始化一个数组的时候,若不显式地用键值对方式赋值,则会默认用数字作为下标,从 1 开始。由于在 Lua 内部实际采用哈希表和数组分别保存键值对、普通值,所以不推荐混合使用这两种赋值方式。
对于常规的数组,里面从 1 到 n 放着一些非空的值的时候, 它的长度就精确的为 n,即最后一个值的下标。
所以,对应的建议就是:
一、不要混用;
二、如果你要删除一个数组中的元素,请使用 remove 函数,而不是用 nil 赋值。
参考:
https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/table_library.html
https://moonbingbing.gitbooks.io/openresty-best-practices/content/lua/array_size.html
OpenStar是一个基于OpenResty的,高性能WAF,还相应增加了其他灵活、友好、实用的功能,是增强的WAF
https://github.com/starjun/openstar
ngx_lua_waf是一个基于lua-nginx-module(openresty)的web应用防火墙
https://github.com/loveshell/ngx_lua_waf
ngx_http_lua_module – 嵌入强有力的 Lua 到 Nginx HTTP 服务中
https://github.com/openresty/lua-nginx-module
https://github.com/iresty/nginx-lua-module-zh-wiki
nginx结合lua抓取response报文
https://threathunter.org/topic/59cbb187ec721b1f1966ebfb
非虫 | Lua程序逆向之Luac文件格式分析
https://mp.weixin.qq.com/s/aVZw7iZVbyXYfYPo8fpH_w
https://github.com/feicong/lua_re
Lua 全教程
http://ialloc.org/posts/2017/11/17/programming-in-lua/
C和Lua之间的相互调用
http://www.cnblogs.com/lijiajia/p/8284328.html
编程语言 – Lua 全教程
https://ialloc.org/posts/2017/11/17/programming-in-lua/
`
Lua 简介
Lua 版本
Lua 环境
开发工具
软件包管理
分析和调试
基础概念
常量和标识符
变量和数据类型
表达式(expression)
语句(statement)
惯用法
高级特性
高级语法结构
元表(metatable)
环境(environment)
闭包(closure)
协程(coroutine)
代码组织
模块(module)
定义模块
使用模块
模块查找
包(package)
面向对象
语言互操作
C API
FFI
其它
命令行参数
装饰器
优化建议
常用类库
参考资料
Footnotes
`