Nginx14-Lua基础

[复制链接]
发表于 2024-10-23 03:20:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
零、文章目录

Nginx14-Lua基础



  • Nginx是可扩展的,可用于处理各种使用场景。本节中,我们将探讨使用Lua扩展Nginx的功能。
1、简介

(1)概念



  • Lua是一种轻量、小巧的脚本语言,用标准C语言编写并以源代码情势开发。设计的目标是为了嵌入到其他应用程序中,从而为应用程序提供灵活的扩展和定制功能。
(2)特性



  • 跟其他语言举行比较,Lua有其自身的特点:

    • 轻量级:Lua用标准C语言编写并以源代码情势开发,编译后仅仅一百余千字节,可以很方便的嵌入到其他程序中。
    • 可扩展:Lua提供非常丰富易于使用的扩展接口和机制,由宿主语言(通常是C或C++)提供功能,Lua可以使用它们,就像内置的功能一样。
    • 支持面向过程编程和函数式编程

(3)应用场景



  • 游戏开发
  • 独立应用脚本
  • web应用脚本
  • 扩展和数据库插件
  • 体系安全上
2、Lua的安装

(1)下载所在



  • Lua官网所在:https://www.lua.org
  • Lua官网下载所在:https://www.lua.org/download.html
  • 我们可以直接下载https://www.lua.org/ftp/lua-5.4.7.tar.gz再上传服务器,也可以使用wget下令直接下载。
  • 百度网盘所在:https://pan.baidu.com/s/1Eriuc9kWd9Xj0CR23ISZOw?pwd=1234
(2)安装



  • 在linux上安装Lua非常简单,只必要下载源码包并在终端解压、编译即可使用。
  1. # 创建文件目录
  2. mkdir /opt/lua
  3. cd /opt/lua
  4. # 下载
  5. # 我们可以下载再上传服务器,也可以使用wget命令在服务器上直接下载
  6. wget https://www.lua.org/ftp/lua-5.4.7.tar.gz
  7. # 解压
  8. tar -zxvf lua-5.4.7.tar.gz
  9. # 编译安装
  10. cd lua-5.4.7
  11. make linux test
  12. make install
  13. # 验证是否安装成功
  14. lua -v
复制代码


  • 假如在实行make linux test失败,报体系缺少libreadline-dev依赖包,必要通过下令来举行安装
  1. yum install -y readline-devel
复制代码
3、Lua的语法



  • Lua和C/C++语法非常相似,整体上比较清晰,简便。条件语句、循环语句、函数调用都与C/C++基本划一。假如对C/C++不太熟悉的同砚来说,也没关系,因为天下语言是一家,基本上理解起来都不会太困难。我们一点点来讲。
(1)交互方式



  • Lua有两种交互方式

    • **交互式:**指可以在下令行输入程序,然后回车就可以看到运行的效果。
    • **脚本式:**脚本式是将代码保存到一个以 lua 为扩展名的文件中并实行的方式。

  • **交互式:**Lua交互式编程模式可以通过下令lua -i 或lua回车来进入Lua交互式环境,直接输入下令回车就可以看到效果,末了通过Ctrl+C可以退出交互环境。
  1. [root@localhost lua-5.4.7]# lua
  2. Lua 5.4.7  Copyright (C) 1994-2024 Lua.org, PUC-Rio
  3. > print("hello world!")
  4. hello world!
  5. > ^C
复制代码


  • **脚本式1:**将代码保存到一个以lua为扩展名的文件中,用lua hello.lua实行。
  1. # 创建lua文件,文件写入命令
  2. cd /opt/lua/lua-5.4.7/
  3. vim hello.lua
  4. print("hello world!")
  5. # lua执行
  6. [root@localhost lua]# lua hello.lua
  7. hello world!
复制代码


  • **脚本式2:**直接运行hello.lua文件

    • 将hello.lua做如下修改,第一行用来指定Lua解释器所在位置为 /usr/local/bin/lua,加上#号标志解释器会忽略它。一样平常环境下#!就是用来指定用哪个程序来运行本文件。
    1. #!/usr/local/bin/lua
    2. print("Hello World!!!")
    复制代码
      

    • 但是hello.lua并不是一个可实行文件,必要通过chmod来设置可实行权限如下
    1. chmod 755 hello.lua
    复制代码
      

    • 然后实行该文件
    1. [root@localhost lua]# ./hello.lua
    2. Hello World!!!
    复制代码

  • **交互式中运行脚本:**假如想在交互式中运行脚本式的hello.lua中的内容,我们可以使用一个dofile函数
  1. [root@localhost lua]# lua
  2. Lua 5.4.7  Copyright (C) 1994-2024 Lua.org, PUC-Rio
  3. > dofile("hello.lua")
  4. Hello World!!!
复制代码
(2)分隔符



  • 留意:在Lua语言中,一连语句之间的分隔符并不是必须的,也就是说后面不必要加分号,固然加上也不会报错,
  • 在Lua语言中,表达式之间的换行也起不到任何作用。如以下四个写法,其实都是等效的,不发起使用第四种方式,可读性太差。
  1. 写法一
  2. a=1
  3. b=a+2
  4. 写法二
  5. a=1;
  6. b=a+2;
  7. 写法三
  8. a=1; b=a+2;
  9. 写法四
  10. a=1 b=a+2
复制代码
(3)解释



  • 关于Lua的解释要分两种,第一种是单行解释,第二种是多行解释。
  • 单行解释的语法为:
  1. --注释内容
复制代码


  • 多行解释的语法为:
  1. --[[
  2.         注释内容
  3.         注释内容
  4. --]]
复制代码


  • 假如想取消多行解释,只必要在第一个–之前在加一个-即可,如:
  1. ---[[
  2.         注释内容
  3.         注释内容
  4. --]]
复制代码
(4)标识符



  • 换句话说标识符就是我们的变量名。
  • Lua界说变量名以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下划线,数字(0到9)。
  • 这块发起各人最好不要使用下划线加大写字母的标识符,因为Lua的保留字也是如许界说的,轻易发生冲突。留意Lua是区分巨细写字母的。
(5)关键字



  • 下列是Lua的关键字,各人在界说常量、变量或其他用户自界说标识符都要避免使用以下这些关键字:
andbreakdoelseelseifendfalseforfunctionifinlocalnilnotorrepeatreturnthentrueuntilwhilegoto

  • 一样平常约定,以下划线开头连接一串大写字母的名字(好比 _VERSION)被保留用于 Lua 内部全局变量。这个也是上面我们不发起这么界说标识符的原因。
(6)运算符



  • Lua中支持的运算符有算术运算符、关系运算符、逻辑运算符、其他运算符。
  • 算术运算符
  1. +   加法
  2. -        减法
  3. *        乘法
  4. /        除法
  5. %        取余
  6. ^        乘幂
  7. -        负号
  8. --案例如下
  9. 10+20        -->30
  10. 20-10        -->10
  11. 10*20        -->200
  12. 20/10        -->2
  13. 3%2                -->1
  14. 10^2        -->100
  15. -10                -->-10
复制代码


  • 关系运算符
  1. ==        等于
  2. ~=        不等于
  3. >        大于
  4. <        小于
  5. >=        大于等于
  6. <=        小于等于
  7. --案例如下
  8. 10==10                -->true
  9. 10~=10                -->false
  10. 20>10                -->true
  11. 20<10                -->false
  12. 20>=10                -->true
  13. 20<=10                -->false
复制代码


  • 逻辑运算符
  1. and        逻辑与         A and B     &&   
  2. or        逻辑或         A or B     ||
  3. not        逻辑非  取反,如果为true,则返回false  !
  4. --逻辑运算符可以作为if的判断条件,返回的结果如下
  5. A = true
  6. B = true
  7. A and B        -->true
  8. A or  B -->true
  9. not A         -->false
  10. A = true
  11. B = false
  12. A and B        -->false
  13. A or  B -->true
  14. not A         -->false
  15. A = false
  16. B = true
  17. A and B        -->false
  18. A or  B -->true
  19. not A         -->true
复制代码


  • 其他运算符
  1. ..        连接两个字符串
  2. #        一元预算法,返回字符串或表的长度
  3. --案例如下
  4. > "HELLO ".."WORLD"                -->HELLO WORLD
  5. > #"HELLO"                        -->5
复制代码
(7)全局变量



  • 在Lua语言中,全局变量无须声明即可使用。在默认环境下,变量总是以为是全局的,假如未提前赋值,默以为nil:
  1. [root@master lua-5.4.7]# lua
  2. Lua 5.4.7  Copyright (C) 1994-2024 Lua.org, PUC-Rio
  3. > print(b)
  4. nil
  5. > b=100
  6. > print(b)
  7. 100
  8. > b=nil
  9. > print(b)
  10. nil
复制代码
(8)局部变量



  • 要想声明一个局部变量,必要使用local来声明,终端交互式的 local 声明的变量在同一行使用,换行了则离开了该变量的作用域。
  1. [root@master lua-5.4.7]# lua
  2. Lua 5.4.7  Copyright (C) 1994-2024 Lua.org, PUC-Rio
  3. > local a=100
  4. > print(a)
  5. nil
  6. > local a=100 print(a)
  7. 100
复制代码
3、Lua数据类型



  • Lua有8个数据类型
  1. nil(空,无效值)
  2. boolean(布尔,true/false)
  3. number(数值)
  4. string(字符串)
  5. function(函数)
  6. table(表)
  7. thread(线程)
  8. userdata(用户数据)
复制代码


  • 可以使用type函数测试给定变量或者的类型:
  1. print(type(nil))                                -->nil
  2. print(type(true))               --> boolean
  3. print(type(1.1*1.1))             --> number
  4. print(type("Hello world"))      --> string
  5. print(type(io.stdin))                        -->userdata
  6. print(type(print))              --> function
  7. print(type(type))               -->function
  8. print(type{})                                        -->table
  9. print(type(type(X)))            --> string
复制代码
(1)nil



  • nil是一种只有一个nil值的类型,它的作用可以用来与其他所有值举行区分
  • 想要移除一个变量时,只必要将该变量名赋值为nil,垃圾采取就会会释放该变量所占用的内存。
(2)boolean



  • boolean类型具有两个值,true和false。boolean类型一样平常被用来做条件判断的真与假。
  • 在Lua语言中,只会将false和nil视为假,其他的都视为真,特殊是在条件检测中0和空字符串都会以为是真,这个和我们熟悉的大多数语言不太一样。
(3)number



  • 在Lua5.3版本开始,Lua语言为数值格式提供了两种选择integer(整型)和float(双精度浮点型),和其他语言不太一样,float不代表单精度类型。
  • 数值常量的体现方式:
  1. >4                        -->4
  2. >0.4                -->0.4
  3. >4.75e-3        -->0.00475
  4. >4.75e3                -->4750
复制代码


  • 不管是整型照旧双精度浮点型,使用type()函数来取其类型,都会返回的是number,以是它们之间是可以相互转换的,同时,具有相同算术值的整型值和浮点型值在Lua语言中是相称的
  1. >type(3)        -->number
  2. >type(3.3)        -->number
复制代码
(4)string



  • Lua语言中的字符串即可以体现单个字符,也可以体现一整本书籍。在Lua语言中,操作100K或者1M个字母组成的字符串的程序很常见。
  • 可以使用单引号或双引号来声明字符串。
  1. >a = "hello"
  2. >b = 'world'
  3. >print(a)        -->hello
  4. >print(b)         -->world
复制代码


  • 假如声明的字符串比较长或者有多行,则可以使用如下方式举行声明
  1. html = [[
  2. <html>
  3. <head>
  4. <title>Lua-string</title>
  5. </head>
  6. <body>
  7. <a href="http://www.lua.org">Lua</a>
  8. </body>
  9. </html>
  10. ]]
复制代码
(5)table



  • table是Lua语言中最主要和强大的数据结构。使用表, Lua 语言可以以一种简单、统一且高效的方式体现数组、集合、纪录和其他许多数据结构。 Lua语言中的表本质上是一种辅助数组。这种数组比Java中的数组更加灵活,可以使用数值做索引,也可以使用字符串或其他任意类型的值作索引(除nil外)。
  • 创建表的最简单方式
  1. > a = {}
复制代码


  • 创建数组
  1. --数组:就是相同数据类型的元素按照一定顺序排列的集合
  2. --创建数组
  3. >arr = {"TOM","JERRY","ROSE"}
  4. --要想获取数组中的值,我们可以通过如下内容来获取
  5. print(arr[0])                nil
  6. print(arr[1])                TOM
  7. print(arr[2])                JERRY
  8. print(arr[3])                ROSE
  9. --从上面的结果可以看出来,数组的下标默认是从1开始的。所以上述创建数组,也可以通过如下方式来创建
  10. >arr = {}
  11. >arr[1] = "TOM"
  12. >arr[2] = "JERRY"
  13. >arr[3] = "ROSE"
  14. --上面我们说过了,表的索引即可以是数字,也可以是字符串等其他的内容,所以我们也可以将索引更改为字符串来创建
  15. >arr = {}
  16. >arr["X"] = 10
  17. >arr["Y"] = 20
  18. >arr["Z"] = 30
  19. --当然,如果想要获取这些数组中的值,可以使用下面的方式
  20. --方式一
  21. >print(arr["X"])
  22. >print(arr["Y"])
  23. >print(arr["Z"])
  24. --方式二
  25. >print(arr.X)
  26. >print(arr.Y)
  27. >print(arr.Z)
  28. --当前table的灵活不进于此,还有更灵活的声明方式
  29. >arr = {"TOM",X=10,"JERRY",Y=20,"ROSE",Z=30}
  30. --如何获取上面的值?
  31. TOM :  arr[1]
  32. 10  :  arr["X"] | arr.X
  33. JERRY: arr[2]
  34. 20  :  arr["Y"] | arr.Y
  35. ROESE?
复制代码
(6)function



  • 在 Lua语言中,函数( Function )是对语句和表达式举行抽象的主要方式。
  • 界说函数的语法为:
  1. function functionName(params)
  2. end
复制代码


  • 函数被调用的时间,传入的参数个数与界说函数时使用的参数个数不划一的时间,Lua 语言会通过 抛弃多余参数和将不敷的参数设为 nil 的方式来调解参数的个数。
  1. function  f(a,b)
  2. print(a,b)
  3. end
  4. f()                --> nil  nil
  5. f(2)        --> 2 nil
  6. f(2,6)        --> 2 6
  7. f(2.6.8)        --> 2 6 (8被丢弃)
复制代码


  • 可变长参数函数
  1. function add(...)
  2. a,b,c=...
  3. print(a)
  4. print(b)
  5. print(c)
  6. end
  7. add(1,2,3)  --> 1 2 3
复制代码


  • 函数返回值可以有多个,这点和Java不太一样
  1. function f(a,b)
  2. return a,b
  3. end
  4. x,y=f(11,22)        --> x=11,y=22       
复制代码
(7)thread



  • thread翻译过来是线程的意思,在Lua中,thread用来体现实行的独立线路,用来实行协同程序。
  1. -- 定义一个简单的协程函数
  2. function simpleCoroutine()
  3.     print("Coroutine started")
  4.     coroutine.yield("Hello from coroutine!")
  5.     print("Coroutine resumed")
  6. end
  7. -- 创建协程
  8. local co = coroutine.create(simpleCoroutine)
  9. -- 启动协程
  10. local success, result = coroutine.resume(co)
  11. -- 协程会打印 "Coroutine started" 然后暂停并返回结果
  12. print("Main thread received: " .. result)  -- 打印从协程返回的消息
  13. -- 再次启动协程,协程将继续执行直到结束
  14. success, result = coroutine.resume(co)
  15. -- 打印 "Coroutine resumed"
  16. -- 由于协程已经结束,这里不会打印更多的信息
复制代码
(8)userdata



  • userdata是一种用户自界说数据,用于体现一种由应用程序或C/C++语言库所创建的类型。
4、Lua控制结构



  • Lua 语言提供了一组精简且常用的控制结构,包罗用于条件实行的then以及用于循环的 while、 repeat 和 for。
  • 所有的控制结构语法上都有一个显式的终结符: end 用于终结 if、 for 及 while 结构, until 用于终结 repeat 结构。
(1)if then else



  • if语句先测试其条件,并根据条件是否满足实行相应的 then 部门或 else 部门。 else 部门是可选的。
  1. function testif(a)
  2. if a>0 then
  3.         print("a是正数")
  4. end
  5. end
  6. function testif(a)
  7. if a>0 then
  8.         print("a是正数")
  9. else
  10.         print("a是负数")
  11. end
  12. end
复制代码


  • 假如要编写嵌套的 if 语句,可以使用 elseif。 它类似于在 else 后面紧跟一个if。根据传入的年龄返回不同的结果,如
  1. age<=18 青少年,
  2. age>18 , age <=45 青年
  3. age>45 , age<=60 中年人
  4. age>60 老年人
  5. function show(age)
  6. if age<=18 then
  7. return "青少年"
  8. elseif age>18 and age<=45 then
  9. return "青年"
  10. elseif age>45 and age<=60 then
  11. return "中年人"
  12. elseif age>60 then
  13. return "老年人"
  14. end
  15. end
复制代码
(2)while循环



  • 顾名思义,当条件为真时 while 循环会重复实行其循环体。 Lua 语言先测试 while 语句 的条件,若条件为假则循环结束;否则, Lua 会实行循环体并不停地重复这个过程。
  • 语法:
  1. while 条件 do
  2.   循环体
  3. end
复制代码


  • 案例:实现数组的循环
  1. function testWhile()
  2. local i = 1
  3. while i<=10 do
  4.   print(i)
  5.   i=i+1
  6. end
  7. end
复制代码
(3)repeat循环



  • 顾名思义, repeat-until语句会重复实行其循环体直到条件为真时结束。 由于条件测试在循环体之后实行,以是循环体至少会实行一次。
  • 语法:
  1. repeat
  2. 循环体
  3. until 条件
复制代码


  • 案例:
  1. function testRepeat()
  2. local i = 10
  3. repeat
  4.   print(i)
  5.   i=i-1
  6. until i < 1
  7. end
复制代码
(4)for循环



  • 数值型for循环
  • 语法:
  1. for param=exp1,exp2,exp3 do
  2. 循环体
  3. end
复制代码


  • 案例:param的值从exp1变化到exp2之前的每次循环会实行循环体,并在每次循环结束后将步长(step)exp3增加到param上。exp3可选,假如不设置默以为1
  1. for i = 1,100,10 do
  2. print(i)
  3. end
  4. --输出结果
  5. 1
  6. 11
  7. 21
  8. 31
  9. 41
  10. 51
  11. 61
  12. 71
  13. 81
  14. 91
复制代码


  • 泛型for循环:泛型for循环通过一个迭代器函数来遍历所有值,类似于java中的foreach语句。
  • 语法:
  1. for i,v in ipairs(x) do
  2.         循环体
  3. end
复制代码


  • 案例:i是数组索引值,v是对应索引的数组元素值,ipairs是Lua提供的一个迭代器函数,用来迭代数组,x是要遍历的数组。
  1. arr = {"TOME","JERRY","ROWS","LUCY"}
  2. for i,v in ipairs(arr) do
  3. print(i,v)
  4. end
  5. --输出结果
  6. 1        TOM
  7. 2        JERRY
  8. 3        ROWS
  9. 4        LUCY
复制代码


  • 但是假如将arr的值举行修改,同样的代码在实行的时间,就只能看到和之前一样的结果,而其中的x为JACK就无法遍历出来
  1. arr = {"TOME","JERRY","ROWS",x="JACK","LUCY"}
  2. for i,v in ipairs(arr) do
  3. print(i,v)
  4. end
  5. --输出结果
  6. 1        TOM
  7. 2        JERRY
  8. 3        ROWS
  9. 4        LUCY
复制代码


  • 我们可以将迭代器函数变成pairs,就能遍历出来了
  1. for i,v in pairs(arr) do
  2. print(i,v)
  3. end
  4. --输出结果
  5. 1        TOM
  6. 2        JERRY
  7. 3        ROWS
  8. 4        LUCY
  9. x        JACK
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表