Lua基本语法
编程方式
- 交互式编程:在命令行中输入 lua -i 会弹出一个lua的交互页面,输入相应命令即可返回相应响应。(适用于调试)
- 脚本式编程:保存脚本 (文件名.lua)。编写好脚本后保存使用。
在kali中下载lua ------> apt install lua5.3(需要root权限) 。上述两种编程方式也是在kali命令行下使用。用leafpad(记事本)编写脚本:leafpad 文件名.lua ;运行lua脚本: lua5.3 lua文件。
注释
不执行的说明性文字内容。
- 单行注释:--注释内容
- 多行注释:--[[注释内容--]]
快捷键:ctrl+/
标识符
标识符用来定义一个变量,标识符由数字、字母、下划线组成。其中不能以数字开头。
关键字
在Lua中被保留用来进行特殊操作的词语。关键字有如下: 一般约定,以下划线开头连接一串大写字母的名字(比如__VERSION)被保留用于Lua内部全局变量。
全局变量
在默认情况下,变量都是被认为试全局的。全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil。一个变量存在与否取决于这个变量是都是nil。
--exm
print(b)
-- >nil
b=10
print(b)
-- >10
Lua数据类型
基础介绍
Lua是动态类型语言,变量不要类型定义,只需要为变量赋值。值可以存储在变量中,作为参数传递或结果返回。 Lua中的八个基本类型:nil(空类型)、boolean(布尔类型)、number(数字类型)、string(字符串类型)、userdata(自定义数据类型)、function(函数类型)、thread(线程数据类型)、table(表数据类型)。
--[[查看数据类型的函数
函数:type
--]]
local a=1
local b='abcd'
local c=True
print(type(a))
print(type(b))
print(type(c))
print(type(d))
--[[
-> number
-> string
-> boolean
-> nil
--]]
- nil(空):nil类型表示一种没有任何有效值,它只有一个值 ---> nil。没有赋值的变量,便会输出一个nil值。对于全局变量和table,nil还有一个“删除”作用,给全局变量或者table表里面的变量赋一个nil值,等同于把它们删掉。注意:在比较时应该加上双引号或单引号,如:type(x)==“nil” --> true nil表示一个值:0;“nil”表示一个字符串。
- boolean(布尔):true(真)、false(假)
- number(数字):在lua中默认只有一种number类型 --> double(双精度)类型,所有数据都是用该类型存储(包括:3、3.3、3e+1)
- string(字符串):字符串由一对双引号或单引号来表示。也可以用2个方括号“[[]]”来表示“一块”字符串。在对一个数字字符串进行算数操作时,Lua会尝试将这个数字字符串转成一个数字(s1+s2)。字符串连接(s1..s2)。
- table(表):在Lua里,table的创建是通过构造表达式来完成,最简单构造表达式是{},用来创建一个空表。也可以在表里添加一些数据,直接初始化表。不同于其他语言的数组把0作为数组的初始索引,在Lua里,表的默认初始索引一般以1开始。table不会固定长度大小,有新数据添加时table长度自动增长,没初始的table都是nil。
- function(函数):在Lua中,函数是被看作是第一类值(First-Class Value),函数可以存在变量里。
- thread(线程):在Lua中,最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。
- userdata(自定义类型):userdata是一种用户自定义数据,用于表示一种由应用程序或C/C++语言库所创建的类型,可以将任意C/C++的任意数据类型的数据(通常是struct和指针)存储到Lua变量中调用。
--nil(空)
print(type(x)=="nil")
print(type(x)==nil)
--boolean(布尔)
print(type(true))
print(type(false))
--number(数字)
print(type(2))
print(type(2.2))
print(2e+1)
print(0.2e-1)
print(2.123456e-06)
--字符串
local string1="this is a"
local string2='this is b'
local html=[[
<html>
<head></head>
<body>
<a rel="nofollow" href="http://www.baidu.com/"></a>
</body>
</html>
]]
print(html)
local s1='1'
local s2='2'
print(s1+s2)
print(type(s1+s2))
print(s1..s2)
print(type(s1..s2))
--table(表)
--创建一个空的table
local tbl1={}
--直接初始表
local fruits={"apple","pear","orange","grape"}
print(type(tbl1))
print(fruits[0])
print(fruits[1])
--for循环遍历表fruits
for key,value in pairs(fruits) do
print(key..':'..value)
end
--函数
local function yyds(name)
print(name..',yyds!')
end
yyds('lidasha')
local fbi=yyds
fbi('lixiaosha')
--变量可以作为函数的别名使用。
Lua变量
基础介绍
变量在使用前,必须在代码中进行声明,即创建该变量。变量的默认值均为nil。
变量类型
Lua变量有三种类型:全局变量、局部变量、表中的域。Lua中的变量全是全局变量,那怕是语句块或是函数,除非用local显示声明为局部变量。局部变量的作用域为从生命位置开始到所在语句块结束。
全局变量和局部变量
局部变量之前必须加local进行声明,否则默认认为是全局变量(代码块,函数)。全局变量一般用大写字母开头,局部变量一般用小写字母,这是变量的书写规范。
A=1
local b=2
function Add(A,b)
local d=10
local c=A+b+d
print(c)
end
Add(A,b)
print(c)
print(d)
--输出的c、d是局部变量,所以输出的是nil
赋值语句
Lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。注意避免命名冲突。
A,B=1,2
print(A,B)
-- 交换两个变量的值
A,B=B,A
print(A,B)
表类型索引使用方法
对table的索引使用方括号[]。Lua也提供了.操作。
--[[
t[i]
t.i
--]]
--当索引为字符串类型时的一种简化写法
Site={}
site["key"]="www.w3cschool.cc"
print(site["key"])
print(Site.key)
--这里的key就是表中域,key可以是任意名(符合标识符规则)。
Lua循环结构
循环介绍
很多情况下我们需要做一些有规律性的重复操作,因此在程序中就需要重复执行某些语句。循环语句是由循环体及循环的终止条件两部分组成的。一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。
while循环
Lua编程语言中while循环语句在判断条件为true时会重复执行循环体语句。
A=1
Sum=0
while(A<11) do
Sum=Sum+A
A=A+1
print(A)
print(Sum)
end
print('1到10求和:'..Sum)
for循环
Lua编程语言中for循环语句可以重复执行指定语句,重复次数可以在for语句中控制。 Lua编程语言中for语句有两大类:
数值for循环:--->指定循环次数
for i=1,10 do
print(i)
end
泛型for循环:--->用于遍历一个表
fruits={'a','b','c'}
for key,value in pairs(fruits) do
print(key,value)
end
--key:代表编号
--value:代表表中的值
repeat..until循环
Lua编程语言中repeat...until循环语句不同于for和while循环,for和while循环的条件语句在当前循环执行开始时判断,而repeat...until循环的条件语句在当前循环结束后判断。
--用repeat...until求和1~10
A=1
Sum=0
repeat
Sum=Sum+A
A=A+1
until(A>10)
print(Sum)
Lua条件判断结构
条件判断结构介绍
Lua编程语言条件判断语句通过程序设计一个或多个条件语句来设定。在条件为true时执行指定程序代码,在条件为false时执行其他指定代码。
if条件判断
Lua if 语句由一个布尔表达式作为条件判断,其后紧跟其他语句组成。
--语法结构:
if(判断条件)
then
print('判断结果为真时,执行该命令。')
end
--if...else条件判断,语法结构:
if(判断条件)
then
print('判断结果为真,执行该条语句。')
else
print('判断结果为假,执行该条语句。')
end
--if嵌套条件判断,语法结构:
if(判断条件一)
then
if(判断条件二)
then
print('如果条件判断一、二都为真,执行该条语句。')
else
print('如果条件判断一为真且条件判断二为假,执行该条语句')
end
else
print('如果条件判断一为假,执行该条语句。')
end
Lua中的函数
函数介绍
在Lua中,函数时对语句和表达式进行抽象的主要方法。既可以用来处理一些特殊的工作,也可以用来计算一些值。Lua本身有很多内建函数方便使用。
函数结构
--[[
声明该函数类型:local->声明局部;不说默认为全局 function(用于建造函数的关键字) 函数名 该函数所需要的传参(argument1,argument2,argument3,argument4....)
函数的操作部分。
函数的返回值设定部分。
end 用来标志结束函数。
--]]
--[[
函数构造:
(local)function 函数名(参数)
print('函数体内容')
end
--]]
local function he_cha(a,b)
local he=a+b
local cha=a-b
return he,cha
end
local a=2
local b=1
he,cha = he_cha(a,b)
print(he)
print(cha)
函数作为参数
Lua中可以将函数作为参数传递。
myprint =function(params)
print('这是一个打印功能的匿名函数',params)
end
local function add(A,B,jieguo)
result=A+B
jieguo(result)
end
local A=10
local B=7
add(A,B,myprint)
--重在理解函数是作为参数传递
函数可变参数
Lua函数可以接受可变数目的参数,和C语言类似,在函数参数列表中使用三点...表示函数有可变的参数。在遍历长参数的时候只需要使用{...},然而变长参数可能会包含一些nil,那么就可以用select函数来访问变长参数:
- select('#',...):用于表示可变参数的长度
- select(n,...):用于从第n个数开始向后一次访问
在调用select时,必须传入一个固定实参selector(选择开关)和一系列变长参数。如果selector为数字n,那么select返回它的第n个可变实参,否则只能为字符串“#”,这样select会返回变长参数的总数。
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,6,7))
--------------------------------
--函数select用法
function too(...)
for i=1,select('#',...) do
arg=select(i+1,...)
print(arg)
end
end
too(1,2,3,4,5)
--“...”应该可以改成表等数据
Lua中的运算符
运算符介绍
定义:运算符是一个特殊的符号,用于告诉解释器执行特定的数学或逻辑运算。类型有:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 其他运算符