【Linux】Lua脚本语言

介绍:

是一种轻量级的脚本语言,使用C语言编写,并是开源项目,设计的目的是为了嵌入应用程序中,从而为已有的应用程序提供灵活的拓展和定制功能

特性

  • 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
  • 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
  • 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
  • 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。

应用场景

  • 游戏相关的开发
  • 独立应用脚本
  • Web 应用脚本
  • 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
  • 安全系统,如入侵检测系统
  • redis中嵌套调用实现类似事务的功能,redis也支持lua脚本
  • web容器中应用处理一些过滤 缓存等等的逻辑,例如nginx。

安装Lua

1、下载安装包

[root@localhost home]# curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  296k  100  296k    0     0   7308      0  0:00:41  0:00:41 --:--:--  8263

2、解压

[root@localhost home]# tar zxf lua-5.3.5.tar.gz

3、安装插件

[root@localhost home]# yum install libtermcap-devel ncurses-devel libevent-devel readline-devel

4、进入解压包进行编译安装

[root@localhost lua-5.3.5]# make linux test

5、检验是否安装成功

[root@localhost lua-5.3.5]# lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> 

入门操作

万物皆可hello world

1、创建hw.lua文件,并打印内容

[root@localhost lua-5.3.5]# vi hw.lua
print("hello world");

 2、执行lua命令

[root@localhost lua-5.3.5]# lua hw.lua
hello world

Lua语法介绍

1、交互式编程

lua提供了交互式编程模式,即进入命令客户端就可以直接看到效果,首先使用lua或lua -i进入客户端,并且输入print进行打印即可,效果如图: 

2、脚本式编程

lua提供了脚本式的编程,即我们可以将lua程序代码写在以lua为后缀的文件中并执行这个文件,比如上面“入门操作”中的操作案例一样,那接下来我们看一下我们怎么去写这个脚本式

2.1、注释

  1. --:单行注释
  2. --[[...]]:多行注释

3、声明变量

默认情况下,声明的每一个变量都是全局变量,如果需要局部/成员变量就需要加上一个local关键字即可,如图

需要注意的时,如果调用的变量没有或者没有初始值,就会和redis客户端一样,返回一个nil,而不是null

4、数据类型

数据类型描述
nil只要是返回nil都属于该数据类型,它标识一个无效值,在条件表达式中表示false
boolean布尔值,和java一样,只有true/false
number表示双精度的实浮点数
string字符串,和java不同的地方是它可以用单引号或者双引号
function由C或Lua编写的函数
userdata表示任意存储在变量中的C数据结构
thread标识执行的独立线程,用于执行协同程序
tableLua 中的table,相当于mysql中的表,它其实是一个“关联数组”(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过“构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。

 具体用法,我们用命令看一下:

5、流程控制

2.5.1、if语句

语法:

if(布尔表达式)
then
   --[ 在布尔表达式为 true 时执行的语句 --]
end

效果如图:

2.5.2、if..else

语法:

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

 效果如图:

6、while循环

语法:

while(condition)
do
   --[需要循环的逻辑代码]
end

效果如图:

7、for循环

语法:

for var=exp1,exp2,exp3 
do  
    --[需要循环的代码逻辑]
end 

跟java的for进行相比,for(int i=0;i<=10,i++),上面的语法中exp1相当于int i=0,给予变量起始值,exp2相当于i<=10,给定循环条件,exp3相当于i++,表示每次循环之后的自增步长

效果如图:

循环一个初始值为1,每次循环i就加1,一直循环到i=10位置

8、repeat..until循环

特别说明:repeat..until也是循环,但是和while和for循环还有所不同,for和while循环的条件语句是在当前循环执行前进行判断,只有在条件满足之后才能进入循环体执行逻辑,而repeat..until循环的条件语句是在当前循环执行完之后判断的

语法:

repeat
   --[需要循环的代码逻辑]
until( condition )

效果如图:

可能看着效果图,再加上上面对区别for和while的讲解一块来看,可能会迷糊,那我们来讲解一下:首先我们先定一个变量num,初始值是1,在使用repeat语句的时候,它没有条件判断,num是直接进入repeat方法体,直接打印了1,然后+1,此时num=2,那这个时候,这个循环需要判断有没有必要再循环打印num,就会判断num>10不?此时num=2,肯定不大于10,所以会继续循环,以此类推~

9、function函数

 语法:

function 函数名(参数)
    --[执行逻辑代码]
end

比较最大值,效果如图:

 

10、表 

lua中的table是一种数据结构,是用来帮我们创建不同数据类型的,比如数组、字典等等,也可以解决模块、包、对象

10.1、模块

10.1.1、模块定义

创建一个module.lua文件,写入以下代码:

-- 定义一个名为 module 的模块
module = {}
 
-- 定义一个常量
module.constant = "这是一个module中的常量"
 
-- 定义一个函数
function module.func1()
    print("这是一个公有函数")
end
 
local function func2()
    print("这是一个私有函数!")
end
 
function module.func3()
    func2()
end
 
return module

10.1.2、require函数

作用是引入其他的模块,相当于java中调用其他的类

语法:

require("模块名/变量")

我们创建一个test_module.lua的文件,其中的代码我们写:

[root@localhost lua-5.3.5]# vi test_module.lua
--调用某一个模块,使用引号来引用模块名即可
require("module")
--调用某个模块下的常量
print(module.constant)
--调用某个模块下的函数
module.func3()

我们调用10.1.1中的变量和方法,效果如图:

 


版权声明:本文为qq_38377525原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。