Lua脚本语言简单学习

最近要研究Nmap的脚本编写,于是特定来看一下lua语言

什么是Lua

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。可用于游戏开发、独立应用脚本、Web应用脚本、扩展和数据库插件、安全系统等.

Lua语言特性

轻量级:它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里
可扩展:Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
支持面向过程和函数式编程、自动内存管理等

基本语法

Hello World

print("Hello World")
  • 注释
--  //两个减号是单行注释

--[[
xxx
xxx
--]]
则为多行注释
  • 变量声明
直接使用  test=123  就行了
默认是全局变量

test=nil  //删除变量的话直接将其赋值为nil就行了

数据类型

nil //这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)
boolean //  包含两个值:false和true。
number //表示双精度类型的实浮点数
string //字符串由一对双引号或单引号来表示
function //由 C 或 Lua 编写的函数
userdata //表示任意存储在变量中的C数据结构
thread //表示执行的独立线路,用于执行协同程序
table //Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。
print(type("Hello world"))
print(type(10.4*3))
print(type(print))
print(type(type))
print(type(true))
print(type(nil))
print(type(type(X)))

?

  • nil的删除作用
tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end

tab1.key1 = nil
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end
-- 这里我们还可以了解lua的for循环是怎么用的,还有字符串连接符是..
  • nil做比较时需要用引号

?

  • 布尔型的数据类型
if true then
    print("QAQ")
else
    print("233")
end
--还学习到了if语句的使用格式
  • 字符串的另一种表示方法
a = [[
asdassddsaasd
asdasdsa
]]
print(a)
-- 使用[[]]可以也表示字符串

当字符串进行算数运算的时候,Lua会尝试将字符串转换为数字

print("100"+"100")

?

使用#来计算字符串的长度(很像Shell脚本)

print(#"qwer")

?

  • table(类似弱类型语言里面的关联数组)
-- 创建一个空的 table
local tbl1 = {}

-- 直接初始表
local tbl2 = {"apple", "pear", "orange", "grape"}

-- local代表局部变量
a = {}
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
    print(k .. " : " .. v)
end

-- lua语言表里面一般默认的初始索引以1开始
  • 函数
function factorial1(n)
    if n == 0 then
        return 1
    else
        return n * factorial1(n - 1)
    end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))

-- 跟Shell脚本一样,函数也可以赋值给变量

--匿名函数

function testFun(tab,fun)
        for k ,v in pairs(tab) do
                print(fun(k,v));
        end
end

tab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)
        return key.."="..val;
end
);
  • 线程/自定义类型

xxx

Lua变量

变量分别为全局变量、局部变量、表中的域
 
赋值语句(因为其特性我们可以很方便的做变量交换)

a=123
b=321
a,b=b,a  --这样a,b就交换了值
print(a,b)

?

当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略:

a. 变量个数 > 值的个数             按变量个数补足nil
b. 变量个数 < 值的个数             多余的值会被忽略
a, b, c = 0, 1
print(a,b,c)             --> 0   1   nil

a, b = a+1, b+1, b+2     -- value of b+2 is ignored
print(a,b)               --> 1   2

a, b, c = 0
print(a,b,c)             --> 0   nil   nil
  • 对表的索引
t["i"]
t.i
gettable_event(t,i)
-- 以上就是对表中数据的索引获取

循环

-- while
while(condition)
do
   statements
end
-- for 循环
for var=exp1,exp2,exp3 do   -- exp3默认为1
    <执行体>
end
--  repeat...until 循环
repeat
   statements
until( condition )
-- break goto等等(没有continue)

流程控制

--[ 0 为 true ]
if(0)
then
    print("0 为 true")
end
-- if...else 语句
if(布尔表达式)
then
   --[ 布尔表达式为 true 时执行该语句块 --]
else
   --[ 布尔表达式为 false 时执行该语句块 --]
end

函数

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
    function_body
    return result_params_comma_separated
end

--[[ optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。

function_name: 指定函数名称。

argument1, argument2, argument3..., argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。

function_body: 函数体,函数中需要执行的代码语句块。

result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。--]]

运算符

算数运算符:+ - * / % ^ -
 
关系运算符

==   //等于
~=   //不等于
>    //大于
<    //小于
>=   //大于等于
<=   //小于等于

逻辑运算符

and or not

字符串

常用的一些操作忽略
 
字符串操作

string.upper(xxx)  //转为大写
string.lower(xxx)  //转为小写
string.gsub(mainString,findString,replaceString,num)  //替换
mainString 为要操作的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换
string.find (str, substr, [init, [end]])  //在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置。不存在则返回 nil。
string.reverse(arg) //字符串反转
string.format(...)  //返回一个类似printf的格式化字符串
string.format("the value is:%d",4)
string.char(arg) 和 string.byte(arg[,int]) //char 将整型数字转成字符并连接, byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。

> string.char(97,98,99,100)
abcd
> string.byte("ABCD",4)
68
> string.byte("ABCD")
65

string.len(arg) //计算字符串长度。
string.rep(string, n)  //返回字符串string的n个拷贝
string.match(str, pattern, init) //string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。

Lua数组

跟表差不多,多维什么的都一样

lua表

-- 初始化表
mytable = {}

-- 指定值
mytable[1]= "Lua"

-- 移除引用
mytable = nil
-- lua 垃圾回收会释放内存

关于对表的操作

table.concat(table [, sep [, start [, end]]]) --指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。
table.insert(table, [pos,] value) --在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.
table.remove(table [, pos])  --返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。
table.sort(table,)  -- 对给定的table进行升序排序

lua语言的模块与包机制

很类似于php中的文件包含
 
模块:是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table 就行。以下为创建自定义模块 module.lua

-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}

-- 定义一个常量
module.constant = "这是一个常量"

-- 定义一个函数
function module.func1()
    io.write("这是一个公有函数!\n")
end

local function func2()
    print("这是一个私有函数!")
end

function module.func3()
    func2()
end

return module

使用require可以加载模块

require("xxx")
require "xxx"

调用

require("module")
print(module.constant)
module.func3()

或者重新定义一个名字

local m = require("module")

print(m.constant)

m.func3()

模块的加载机制

对于自定义的模块,模块文件不是放在哪个文件目录都行,函数 require 有它自己的文件路径加载策略,它会尝试从 Lua 文件或 C 程序库中加载模块,

包什么的就暂时放一下,应该够写Nmap脚本啦

原文地址:https://www.cnblogs.com/Mikasa-Ackerman/p/Lua-jiao-ben-yu-yan-jian-dan-xue-xi.html

时间: 2024-10-12 20:01:51

Lua脚本语言简单学习的相关文章

(一)Lua脚本语言入门

今天开始自己的Lua语言学习,Lua脚本语言,是介于应用程序和开发其应用程序的底层编程语言之间,,它很方便调用其它语言,它只是在载入时对其进行编译,而不像我们写的单片机程序是预编译的,先编译好然后写入单片机,它只是在调用时编译,所以脚本语言的灵活性很高,,,,,对于自己为什么又开始学习脚本语言了,,因为需要了 ........ 先打印个 hello world 一,变量 Lua有五种变量类型nil,Boolean,string,Number,table 看一个例子,,,,,,,,,先哄我外甥玩,

Java中使用Lua脚本语言(转)

Lua是一个实用的脚本语言,相对于Python来说,比较小巧,但它功能并不逊色,特别是在游戏开发中非常实用(WoW采用的就是Lua作为脚本的).Lua在C\C++的实现我就不多说了,网上随便一搜,到处都是这方面的介绍,我想说的是如何在Java下使用Lua以提高编程效率.增强你的程序可扩展性. 首先,要在Java上使用Lua脚本,必须有关于Lua脚本解释器以及Java程序可以访问这些脚本的相关API,即相关类库.我使用的是一个叫做LuaJava的开源项目,可以在: http://www.keple

(五)Lua脚本语言入门

---恢复内容开始--- 写完这篇Lua脚本语言入门,自己就要尝试去用Lua脚本语言写esp8266了,,自己现在挺心急的,因为朋友使用esp8266本来说自己帮忙写好程序的,但是用的单片机不一样自己没有,没有办法测试,用AT指令就显得不方便,还要根据单片机改程序,,而且自己以前用感觉AT指令发信息那块,麻烦,,,,自己知道用脚本去操作8266要比AT指令灵活和稳定的多,真想赶紧学会用Lua脚本去操作8266,那样的话就可以很方便的帮到朋友了......本来答应了,,,,,,,竟然食言了....

题外话:Lua脚本语言存在的意义

纯属个人见解. 大致来说:c/c++执行效率高,游戏中一些性能敏感的复杂计算需要用c/c++来实现,防止游戏卡顿和低帧率.这些复杂计算包括战斗逻辑,复杂AI,骨骼动画蒙皮骨骼点的坐标计算等等.但c++是一种比较复杂的编程语言,开发效率较低.嘛,不过这不是主要问题,对于商业手游项目只用c++开发,是致命的.这一点在后边lua具体说明. lua是脚本语言,执行效率不及c/c++,往往用来实现性能不敏感的游戏逻辑,比如窗口界面等等.另外lua语法简单,开发效率高,没有编程背景的策划花精力后也可以掌握,

Lua脚本语言基础知识

  注释 在Lua中,你可以使用单行注释和多行注释. 单行注释中,连续两个减号"--"表示注释的开始,一直延续到行末为止.相当于C++语言中的"//". 多行注释中,由"--[["表示注释开始,并且一直延续到"]]"为止.这种注释相当于C语言中的"/*-*/".在注释当中,"[["和"]]"是可以嵌套的. 分割符 在Lua中,语句之间可以用分号":"

(二)Lua脚本语言入门

上一篇文章忘了插入代码了,方便粘贴复制...... 函数 对于c语言就是 void aa()//c语言是用void { print("这是一个函数") } Lua就变成了 function aa()--定义一个函数 print("这是一个函数") end aa()--调用函数 function aa(str)--定义一个函数 print("传进来的是"..str) end aa(123)--调用函数 看有返回值的 function aa(str)

[转载]一、ESP8266下载和刷固件(基于Lua脚本语言)

用自己的小板测试...... 安排上呢 一, ESP8266下载和刷固件(Lua开发----体验一下lua开发的魅力所在) 二, 控制一个灯亮灭 三, TCP服务器 四, TCP客户端 五, UDP 六, 文件操作(保存数据到8266内部) 七, 外设操作(SPI,ADC) 八, 再说...... 最终能让大家轻松的做到 http://www.cnblogs.com/yangfengwu/p/7513097.html 轻松使用8266 先看下载自己的固件 填写好自己的的邮箱地址,然后选择好自己需

ESP8266 LUA脚本语言开发: 准备工作-LUA文件加载与变量调用

前言 这节说一下多个文件调用 多个文件之间变量调用 准备两个文件 init.lua other.lua 开始 模块默认一开始调用的是init.lua 咱让init.lua调用 other.lua 很简单 dofile("other.lua") 注意: 因为是init.lua 调用 other.lua 所以需要先下载 other.lua 然后再下载 init.lua 软件已启动便会 打开other.lua 然后调用 print("other") 现在看变量 记住一句话

ESP8266 LUA脚本语言开发: 准备工作-LUA开发说明

前言 开发Lua需要使用这个软件 注:该软件需要按照JDK  即 JAVA虚拟机,如果没有安装过JDK,请先看JDK安装教程安装JDK USB线连接开发板接入电脑 选择自己的串口号 波特率115200 然后点击打开 复位下模块 注意: 就像是咱单片机默认一开始执行main一样 LUA开发的时候 ,LUA默认执行 init.lua文件 因为现在里面没有init.lua文件所以有下面的显示 新建init.lua文件 打印 hello 8266 print("hello 8266") 然后把