`

Lua基础整理

 
阅读更多

 

 

 

https://github.com/openresty/lua-nginx-module#status

 

 

and逻辑与操作符。 “短路求值” 若 A 为 false,则返回 A,否则返回 B。(A and B) 为 false。

or逻辑或操作符。“短路求值”  若 A 为 true,则返回 A,否则返回 B。(A or B) 为 true。

lua中除了false和nil之外,其他所以数据,包括0、空字符串等都是true。

类型:

print(type("Hello world"))      --> string

print(type(10.4*3))             --> number

print(type(print))              --> function

print(type(type))               --> function

print(type(true))               --> boolean

print(type(nil))                --> nil

print(type(type(X)))            --> string

 

nil删除功能:对于全局变量和 table,nil 还有一个"删除"作用,给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉

nil 作比较时应该加上双引号 ":  type(X)=="nil" --- true

Lua 把 false 和 nil 看作是"假",其他的都为"真":

字符串和数字:一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字

字符串连接:print("a" .. 'b')  tonumber(字符串)  -- tostring(bVar)

字符串长度:使用 # 来计算字符串的长度,放在字符串前面

table类型:

1、不同于其他语言的数组把 0 作为数组的初始索引,在 Lua 里表的默认初始索引一般以 1 开始

2、"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。

3、table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil

函数是被看作是"第一类值(First-Class Value)",函数可以存在变量里:

table类型是否为nil变量

function isTableEmpty(t)

    if t == nil or _G.next(t) == nil then

        return true

    else

        return false

    end

end

 

全局变量和局部变量:a = 5  -- 全局变量 local b = 5         -- 局部变量

Lua 可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。

赋值规则:a. 变量个数 > 值的个数             按变量个数补足nil

  b. 变量个数 < 值的个数             多余的值会被忽略

对 table 的索引使用方括号 []。Lua 也提供了 . 操作

 

循环:

while( true )

do

   print("循环将永远执行下去")

end

 

if(0)

then

    print("0 为 true")

end

 

 

 

 

for k, v in pairs(tab1) do

    print(k .. " - " .. v)

end

函数:Lua函数可以返回多个结果值,比如string.find,其返回匹配串"开始和结束的下标"(如果不存在匹配串返回nil)。

Lua 函数可以接受可变数目的参数,和 C 语言类似,在函数参数列表中使用三点 ... 表示函数有可变的参数

我们也可以通过 select("#",...) 来获取可变参数的数量:

有时候我们可能需要几个固定参数加上可变参数,固定参数必须放在变长参数之前

 

通常在遍历变长参数的时候只需要使用 {…},然而变长参数可能会包含一些 nil,那么就可以用 select 函数来访问变长参数了:select('#', …) 或者 select(n, …)

select('#', …) 返回可变参数的长度

select(n, …) 用于访问 n 到 select('#',…) 的参数

 

table数结构:

table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。

Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。

Lua table 是不固定大小的,你可以根据自己需要进行扩容。

Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用"format"来索引table string

 

 

 

 

 

 

 

 

https://github.com/openresty/lua-nginx-module#introduction

 

 

content_by_lua 是内容处理器,接受请求并输出响应,适用于location、location if。 

access_by_lua 在请求访问阶段处理,用于访问控制,适用于http、server、location、location if。

rewrite_by_lua

set_by_lua

set_by_lua_file执行Nginx外部的lua脚本,可以避免在配置文件中使用大量的转义

 

 

location / {

rewrite_by_lua '

local res = ngx.location.capture("/check-spam")

if res.body == "spam" then

ngx.redirect("/terms-of-use.html")

end

'; fastcgi_pass ...;

}

 

location /echo {

default_type text/plain;

echo hello lua;

}

 

location /lua {

default_type text/plain;

content_by_lua 'ngx.say("hello world")';

}

 

 

ip禁止功能

location @client{

proxy_pass  http://www.baidu.com;

}

location ~  /test {

default_type  text/html;

content_by_lua 'ngx.say("this is  ruifengyun.com!")';

access_by_lua '

if ngx.var.remote_addr == "10.2.20.110" then

ngx.exit(ngx.HTTP_FORBIDDEN)

end

if ngx.var.remote_addr == "10.2.20.112" then

ngx.exec("@client")

end

';

}

 

重定向转发-获取重定向的参数

location /foo {

 content_by_lua_block {

     ngx.exec("/bar", "a=goodbye");

 }

}

 

 

location /bar {

 default_type text/plain;

 content_by_lua_block {

     local args = ngx.req.get_uri_args()

     for key, val in pairs(args) do

if key == "a" then

     ngx.say(val)

end

     end

 }

}

 

nginx定义的变量 lua中可以获取

 

 location /foo {

     set $my_var ''; # this line is required to create $my_var at config time ngx.arg[1]可以获取定义的参数

     content_by_lua_block {

         ngx.var.my_var = 123;

         ...

     }

 }

删除变量 ngx.var.args = nil如:ngx.var.name = nil 删除nginx中name的变量 

 

 

ngx.ctx-一个生命周期中共享变量

 location /test {

     rewrite_by_lua_block {

         ngx.ctx.foo = 76

     }

     access_by_lua_block {

         ngx.ctx.foo = ngx.ctx.foo + 3

     }

     content_by_lua_block {

         ngx.say(ngx.ctx.foo)

     }

 }

 

 

  ngx.HTTP_GET

  ngx.HTTP_HEAD

  ngx.HTTP_PUT

  ngx.HTTP_POST

  ngx.HTTP_DELETE

  ngx.HTTP_OPTIONS   (added in the v0.5.0rc24 release)

  ngx.HTTP_MKCOL     (added in the v0.8.2 release)

  ngx.HTTP_COPY      (added in the v0.8.2 release)

  ngx.HTTP_MOVE      (added in the v0.8.2 release)

  ngx.HTTP_PROPFIND  (added in the v0.8.2 release)

  ngx.HTTP_PROPPATCH (added in the v0.8.2 release)

  ngx.HTTP_LOCK      (added in the v0.8.2 release)

  ngx.HTTP_UNLOCK    (added in the v0.8.2 release)

  ngx.HTTP_PATCH     (added in the v0.8.2 release)

  ngx.HTTP_TRACE     (added in the v0.8.2 release)

 

 

 ngx.STDERR

   ngx.EMERG

   ngx.ALERT

   ngx.CRIT

   ngx.ERR

   ngx.WARN

   ngx.NOTICE

   ngx.INFO

   ngx.DEBUG

 

 

ngx.redirect("http://jd.com", 302)  

 

   value = ngx.HTTP_OK (200)

   value = ngx.HTTP_CREATED (201)

   value = ngx.HTTP_ACCEPTED (202) (first added in the v0.9.20 release)

 

ngx.req.read_body

 

打印日志:

ngx.log(log_level, ...)

 ngx.log(ngx.NOTICE, ...)

  ngx.header.content_type = 'text/plain';

 ngx.header["X-My-Header"] = 'blah blah';

 

 local request_time = ngx.now() - ngx.req.start_time()

ngx.req.get_method

ngx.req.set_method

 

 重定向:

 ngx.req.set_uri

 ngx.req.set_uri("/foo", true)

ngx.req.get_uri_args

ngx.req.set_uri_args

local args, err = ngx.req.get_post_args()

ngx.req.get_headers

ngx.req.set_header

ngx.req.clear_header

ngx.req.read_body

ngx.req.get_body_file

 

ngx.req.set_body_data

 

ngx.redirect

ngx.print 没有回车 

ngx.say 有回车 

 

ngx.flush

ngx.exit(501) 返回状态吗,并直接退出 

ngx.sleep

ngx.today

ngx.time

ngx.now

ngx.update_time

ngx.utctime

ngx.re.match

ngx.re.find

ngx.re.gmatch

ngx.re.sub

ngx.re.gsub

ngx.shared.DICT

local ok, err = ngx.timer.at(2, mylog ) 延时器,只会执行一次 

 

--写响应头  

ngx.header.a = "1"  

--多个响应头可以使用table  

ngx.header.b = {"2", "3"}  

--输出响应  

ngx.say("a", "b", "<br/>")  

ngx.print("c", "d", "<br/>")  

--200状态码退出  

return ngx.exit(200)  

 

必须调用exit给出状态码

ngx.say("api is offline!")

ngx.exit(200)

 

 

 

获取消息体,先打开获取消息体的开关:

ngx.req.read_body()

local data = ngx.req.get_body_data()

 

加载table.new这个模块,作用为:为新创建的table类型分配空间:ok, new_tab = pcall(require, "table.new")

 

resty.iputils 工具类使用:https://github.com/hamishforbes/lua-resty-iputils

 

https://www.kancloud.cn/allanyu/openresty-best-practices/82647

客户端的IP:ngx.var.binary_remote_addr

 

 

分享到:
评论

相关推荐

    lua网页资料整理

    1. **Lua基础语法**:包括变量、数据类型(如数字、字符串、表、函数等)、控制结构(如if语句、循环)和函数的使用。 2. **Lua表操作**:Lua的核心特性是其灵活的表类型,可用于实现数组、哈希、对象等,理解其...

    Lua 5.1 中文参考手册.pdf (入门与提高)

    Lua是一种轻量级的脚本语言,它在设计上支持通用的过程...以上内容便是根据提供的文件信息整理的Lua语言的基础知识点,其涉及了Lua的设计理念、语言特性和基本语法。希望这些信息对于学习和使用Lua语言的用户有所帮助。

    Lua 5.1 manual 笔记

    本文档主要根据 FinixLei 整理的 Lua 5.1 手册笔记进行提炼与总结,重点在于介绍 Lua 的基本数据类型及其用法。 #### 基本数据类型概述 在 Lua 中,存在多种基本的数据类型,包括 `nil`、`boolean`、`number`、`...

    基于nginx+lua+dyups实现服务自定义调度资源整理

    **七、`nginx`基础配置与管理** 1. **Server Name配置**:`server name`用于匹配请求的主机名,是`nginx`配置中的关键部分。 2. **`nginx`重启与热加载**:当`lua`代码变动后,可以通过`nginx`的平滑重启或热装载...

    lua检查语法

    Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器配置等领域。...在处理"代码"目录下的源文件时,务必善用这类工具,以确保Lua代码的语法无误,为后续的运行和调试打下坚实的基础。

    Lua知识脑图.rar

    1. **Lua基础** - 变量:Lua中的变量无类型限制,使用`local`关键字声明,支持全局变量和局部变量。 - 数据类型:包括 nil, boolean, number, string, table, function, thread 和 userdata。 - 表(Table):...

    Lua移植到标准ANSI C环境

    准备阶段还需要将Lua源代码文件整理并放置于指定位置,例如`source/lua`目录下,并确保删除不必要的文件(如`makefile`、`lua.c`和`luac.c`)。这一步是为了简化之后的操作流程,确保移植过程更加顺畅。 **1.6 组织...

    lua2 我的学习资料lua2 我的学习资料lua2 我的学习资料lua2 我的学习资料lua2 我的学习资料

    在深入探讨Lua的知识点之前,我们先明确一下,"lua2 我的学习资料"这个标题和描述并没有提供具体的信息,可能意味着这是个人整理的学习笔记或者是某门课程的教学材料。"课程资源"标签暗示这可能是一个完整的教学体系...

    Lua中函数与面向对象编程的基础知识整理

    在Lua编程语言中,函数是核心的...以上是Lua中函数和面向对象编程的基础知识。掌握这些概念和技巧,将有助于编写更加灵活和结构化的Lua代码。通过深入理解并实践,开发者可以在Lua环境中有效地实现复杂的功能和系统。

    Programming in Lua 4th Edition带目录

    这本书详细介绍了Lua语言的基础知识和实际应用,适用于想要深入了解Lua的开发者。 Lua是一种轻量级的脚本语言,广泛应用于嵌入应用程序中,它以简洁、高效和易于嵌入而闻名。Lua 5.3是这本书所描述的版本,新增了...

    PHP技术点整理,redis,swoole,搜索引擎,lua,面试题练习

    本文将深入探讨PHP技术中的几个重要知识点:Redis、Swoole、搜索引擎以及Lua,并结合面试题来帮助你巩固理解。...通过实际操作和练习,你将能更好地消化和运用这些知识,为你的IT事业打下坚实的基础。

    Lua编程中的一些基本语法整理

    ### Lua编程语言基础语法知识点详解 #### 一、Lua简介 Lua是一种轻量级的、高效的脚本语言,被广泛应用于游戏开发、嵌入式系统、网页应用等多个领域。其简洁性、灵活性以及易于集成的特点使得Lua成为了很多开发者的...

    lua脚本笔记

    ### Lua脚本语言知识点 ...以上就是基于提供的内容所整理出的关键知识点,涵盖了Lua脚本的基础语法、函数定义、文件操作、变量管理等多个方面。希望这些内容能帮助你更好地理解和掌握Lua编程语言的核心要素。

    Lua中操作字符串的基本方法整理

    ### Lua中操作字符串的基本方法整理 #### 引言 在编程语言Lua中,字符串操作是一项基本而重要的技能。本文将详细介绍Lua中处理字符串的各种方法,包括字符串的初始化、字符串的操作函数(如大小写转换、子字符串...

    自我学习笔记--LUA;python:网络编程等

    至于【标签】中的“python”,说明资料主要侧重于Python编程,可能包括Python的基础语法、数据结构、函数、类、模块等知识,以及Python在网络编程中的应用。 最后,【压缩包子文件的文件名称列表】中提到的“文件夹...

    esp8266个人整理和编写的Demo合集

    本压缩包集合是个人整理和编写的ESP8266 Lua编程示例,包含了一系列实用的Demo,旨在帮助开发者更好地理解和掌握ESP8266的Lua编程。 首先,`led_controller.lua`是一个LED控制脚本,展示了如何通过Lua编程控制ESP...

    luaplus 整理

    ### Lua基础语法 1. **变量声明与赋值**:Lua中的变量无需提前声明,直接赋值即可创建。如`a = 10`,`b = "Hello"`,Lua支持多种数据类型,包括数字、字符串、布尔、表、函数、用户数据和nil。 2. **表**:Lua的表...

    cocos2dx 游戏开发系列之三 源码

    这个开源项目不仅支持多种平台,如iOS、Android、Windows等,还允许开发者使用JavaScript和Lua进行开发。cocos2dx的核心特性包括渲染引擎、物理引擎、音频处理和动画系统等,使得开发者可以专注于游戏逻辑,而不用...

    WOW简易基础入门插件、一个BUTTON、一个功能

    学习和理解这样的插件可以帮助你更深入地了解WOW的自定义机制,你可以根据需要修改代码,添加更多的功能,比如自动整理背包,或者显示特定类型物品的总价值。随着你对Lua和WOW API的熟悉,你会发现开发插件能够极大...

    BabeLua For 2019 V3.2.2.0.zip

    BabeLua是一款专为Visual Studio 2019(VS2019)设计的Lua语言插件,版本V3.2.2.0代表着该工具的最新迭代,它在原有的基础上进行了优化,确保了与VS2019的完美兼容。此插件的出现,极大地提升了VS2019中编写、调试和...

Global site tag (gtag.js) - Google Analytics