Lua基本语法

编程方式

  • ​ 交互式编程:在命令行中输入 lua -i 会弹出一个lua的交互页面,输入相应命令即可返回相应响应。(适用于调试)
  • ​ 脚本式编程:保存脚本 (文件名.lua)。编写好脚本后保存使用。

​ 在kali中下载lua ------> apt install lua5.3(需要root权限) 。上述两种编程方式也是在kali命令行下使用。用leafpad(记事本)编写脚本:leafpad 文件名.lua ;运行lua脚本: lua5.3 lua文件。

注释

​ 不执行的说明性文字内容。

  • 单行注释:--注释内容
  • 多行注释:--[[注释内容--]]

​ 快捷键:ctrl+/

标识符

​ 标识符用来定义一个变量,标识符由数字、字母、下划线组成。其中不能以数字开头。

关键字

​ 在Lua中被保留用来进行特殊操作的词语。关键字有如下: 图片.png 一般约定,以下划线开头连接一串大写字母的名字(比如__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中的运算符

运算符介绍

​ 定义:运算符是一个特殊的符号,用于告诉解释器执行特定的数学或逻辑运算。类型有:

  • 算术运算符
  • 关系运算符
  • 逻辑运算符
  • 其他运算符

算术运算符

图片.png

关系运算符

图片.png

逻辑运算符

图片.png

其他运算符

图片.png