热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lua安装及使用

1Lua介绍Lua是一门以其性能著称的脚本语言,被广泛应用在很多方面。Lua一般用于嵌入式应用,现在越来越多应用于游戏当中,魔兽世界,愤怒的小鸟都有用到。优势Lua极易嵌入到其他程

1 Lua介绍

Lua是一门以其性能著称的脚本语言,被广泛应用在很多方面。Lua一般用于嵌入式应用,现在越来越多应用于游戏 当中,魔兽世界,愤怒的小鸟都有用到。

优势



  1. Lua极易嵌入到其他程序,可当做一种配置语言。

  2. 提升应用性能,比如:游戏脚本,nginx,wireshark的脚本

  3. 兼容性强,可以直接使用 C 代码写的函数。比如corona 移动应用开发平台,跟PhonePap类似,不过使用Lua做开发 语言,应用可以build到iOS,Android,kindle fire,nook平台; 服务器端应该也是Lua。

  4. 在给软件提供嵌入式脚本编程能力上,Lua是绝佳选择。

官网:http://www.lua.org/

Lua脚本的作用:嵌入到应用程序中,给应用程序提供扩展功能。


2 安装

依赖安装:

yum install gcc -y

安装

curl -R -O http://www.lua.org/ftp/lua-5.4.4.tar.gz
tar zxf lua-5.4.4.tar.gz
mv lua-5.4.4/usr/local/
cd /usr/local/lua-5.4.4
make linux test
ln -s /usr/local/lua-5.4.4/src/lua /usr/bin/lua

查看版本

[root@q101 lua-5.4.4]# lua -v
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio

3 Lua语法


3.1 基础语法

参考:https://www.lua.org/manual/5.4/

运行方法

可以编写xxx.lu脚本,通过lua xxx.lua 运行,或者通过 lua -i 交互式编程

helloworld

[root@q101 lua_script]# vi helloworld.lua
[root@q101 lua_script]# lua helloworld.lua
hello!

注释

单行:两个减号

--

多行注释

--[[
多行注释
多行注释
--]]

变量

全局变量:默认情况下,定义一个变量都是全局变量;

局部变量:局部变量声明时使用local关键字,例如:

--全局变量
a=1
--局部变量
local b=2

如果变量没有初始化,则默认值为nil这和Java中的null不同,例如

[root@q101 ~]# lua -i
Lua 5.4.4 Copyright (C) 1994-2022 Lua.org, PUC-Rio
> name="hello"
> local address="beijin"
> print(name)
hello
> print(address)
nil
>

数据类型

Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。 Lua 中有 8 个基本类型分别为:nilbooleannumberstringuserdatafunctionthreadtable











































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

lua中可以通过type函数查看对象类型,例如

> print(type("hello"))
string
> print(type(10.4))
number
> print(type(print))
function
> print(type(type))
function
> print(type(true))
boolean
> print(type(nil))
nil

3.2 流程控制

if语句

Lua if语句 由一个布尔表达式作为条件判断,其后紧跟其他语句组成。 语法:

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

示例:

> age = 9
> if(age <18)
>> then print("study")
>> end
study

if ...else 语句

语法:

if(布尔表达式)
then
--[[表达式为true执行--]]
else
--[[表达式为flase执行--]]
end

示例:

> age=30
> if(age<18)
>> then print("study")
>> else
>> print("work")
>> end
work

3.3 循环

while循环

语法:

while(condition)
do
--[[满足条件执行内容--]]
end

示例:

a=10
while(a>0)
do
print("a=",a)
a=a-1
end

for循环

语法:

Lua 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。

语法:

for var=exp1,exp2,exp3
do
--[[执行体--]]
end

var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次执行体内容。exp3 是可选的,如果不指定,默认为1。

示例:

for a=1,10,2
do
print(a)
end

for a=1,10,2 a=1从1开始循环,10循环数据到10结束,2每次递增2

repeat...until语句

repeat...until 循环语句不同于 for 和 while循环,for 和 while 循环的条件语句在当前循环执行开始

时判断,而 repeat...until 循环的条件语句在当前循环结束后判断,满足until条件后循环结束

语法:

repeat
--[[执行体--]]
until(conditon)

示例:

num=10
repeat
print(num)
num=num+1
until(num>15)


3.4 函数

lua中也可以定义函数,类似于java中的方法。例如:

--比较2个值大小
function max(num1,num2)
if(num1>num2) then
result=num1
else
result=num2
end
return result
end
print("最大值是:",max(5,3))
print("最大值是:",max(11,12))



table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。 Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。

-- 初始化表
mytable = {}
-- 指定值
mytable[0]= "Lua"
-- 移除引用
mytable = nil

模块

模块定义

模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。

创建一个文件叫module.lua,在module.lua中创建一个独立的模块,代码如下:

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

由上可知,模块的结构就是一个 table 的结构,因此可以像操作调用 table 里的元素那样来操作调用模块里的常量或 函数。

上面的 func2 声明为程序块的局部变量,即表示一个私有函数,因此是不能从外部访问模块里的这个私有函数,必须 通过模块里的公有函数来调用.

require 函数

require 用于 引入其他的模块,类似于java中的类要引用别的类的效果。

语法:

require("模块名")
require "模块名"

两种都可以。 我们可以将上面定义的module模块引入使用,创建一个test_module.lua文件,代码如下:

-- test_module.lua 文件
-- module 模块为上文提到到
module.lua require("module")
print(module.constant)
module.func3()

4 Redis + Lua

Redis 在 2.6 版本中推出了脚本功能,允许开发者将 Lua 语言编写的脚本传到 Redis 中执行。使用 Lua 脚本的优点有如下几点:



  1. 减少网络开销:本来需要多次请求的操作,可以一次请求完成,从而节约网络开销;

  2. 原子操作:Redis 会将整个脚本作为一个整体执行,中间不会执行其它命令;

  3. 复用:客户端发送的脚本会存储在 Redis 中,从而实现脚本的复用。

Redis执行lua脚本

# 将lua脚本载到redis
redis-cli script load "$(cat xxx.lua)"
# 执行上一步返回的sha值
redis-cli evalsha "xxx" 0

根据key获取Redis中的value

Redis中目前存在的数据

编写redis1.lua脚本

--索引以数值1开始
local key=KEYS[1]
local list=redis.call("get",key);
return list;

通过脚本获取Redis中的值

[root@q101 lua_script]# redis-cli --eval redis1.lua k1
"aaaa"
[root@q101 lua_script]# vi redis1.lua
[root@q101 lua_script]# redis-cli --eval redis1.lua k2
"bbb"

统计点击数

目前Redis中没有count值



编写redis2.lua

--每次执行count +1
local msg='count:'
local count = redis.call("get","count")
if not count then
redis.call("set","count",0)
end
redis.call("incr","count")
return msg..count+1

执行redis2.lua

redis-cli --eval redis2.lua 0

redis中查询count值


5 OpenResty Nginx + Lua

OpenResty Nginx 安装

官网地址:http://openresty.org/cn/linux-packages.html

yum install yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum install openresty -y
yum install openresty-resty -y

启动\关闭\重启等命令

# 启动
systemctl start openresty
# 查看状态
systemctl status openresty
# 加载配置
systemctl reload openresty
# 关闭
systemctl stop openresty

查看版本openresty -v

[root@q101 utils]# openresty -v
nginx version: openresty/1.19.9.1

测试lua脚本

vi /usr/local/openresty/nginx/conf/nginx.conf
# 在nginx.conf server中写入
location /lua {
default_type text/html;
content_by_lua 'ngx.say("

Hello, OpenResty!

")';
}

# 保存后重新加载配置
systemctl reload openresty

浏览器访问http://192.168.88.101/lua

获取请求nginx uri中的变量

nginx配置修改

location /nginx_var {
default_type text/html;
content_by_lua_block {
# arg_a表示获取参数名为a的参数值
ngx.say(ngx.var.arg_a)
}
}

重新加载配置后浏览器访问:http://192.168.88.101/nginx_var?a=123123



推荐阅读
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • centos 7.0 lnmp成功安装过程(很乱)
    下载nginx[rootlocalhostsrc]#wgethttp:nginx.orgdownloadnginx-1.7.9.tar.gz--2015-01-2412:55:2 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 求助:在CentOS 5.8系统上安装PECL扩展遇到问题
    在 CentOS 5.8 系统上尝试安装 APC 扩展时遇到了问题,具体表现为 PECL 工具无法正常工作。为了确保顺利安装,需要解决 PECL 的相关依赖和配置问题。建议检查 PHP 和 PECL 的版本兼容性,并确保所有必要的库和开发工具已正确安装。此外,可以尝试手动下载 APC 扩展的源代码并进行编译安装,以绕过 PECL 工具的限制。 ... [详细]
  • 在腾讯云服务器上部署Nginx的详细指南中,首先需要确保安装必要的依赖包。如果这些依赖包已安装,可直接跳过此步骤。具体命令包括 `yum -y install gcc gcc-c++ wget net-tools pcre-devel zlib-devel`。接下来,本文将详细介绍如何下载、编译和配置Nginx,以确保其在腾讯云服务器上顺利运行。此外,还将提供一些优化建议,帮助用户提升Nginx的性能和安全性。 ... [详细]
  • CentOS 7环境下Jenkins的安装与前后端应用部署详解
    CentOS 7环境下Jenkins的安装与前后端应用部署详解 ... [详细]
  • 本文深入探讨了使用Puppet进行软件包分发与管理的方法。首先介绍了fpm这一跨平台的软件包制作工具,其简便的操作流程使得软件包的创建变得轻松快捷。fpm的项目地址为:https://github.com/jordansissel/fpm。通过结合Puppet和fpm,可以实现高效、可靠的软件包管理和部署。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • 在Linux环境下编译安装Heartbeat时,常遇到依赖库缺失的问题。为确保顺利安装,建议预先通过yum安装必要的开发库,如glib2-devel、libtool-ltdl-devel、net-snmp-devel、bzip2-devel和ncurses-devel等。这些库是编译过程中不可或缺的组件,能够有效避免编译错误,确保Heartbeat的稳定运行。 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 本文介绍了如何处理在Xcode构建过程中出现的多个命令生成相同文件的问题,特别是当这些文件与Info.plist无关时。 ... [详细]
  • 基于Linux系统的Kickstart自动化服务器部署方案
    本文针对企业需求,提出了一种基于Linux系统的Kickstart自动化服务器部署方案。该方案旨在通过无盘批量安装操作系统,提高企业IT基础设施的部署效率。Kickstart是一种利用Anaconda工具实现服务器自动化安装的技术,能够显著简化和加速操作系统的安装过程。通过详细的实施规划,本文介绍了Kickstart的工作原理及其在实际部署中的应用,为企业提供了高效的自动化部署解决方案。 ... [详细]
  • AIX编程挑战赛:AIX正方形问题的算法解析与Java代码实现
    在昨晚的阅读中,我注意到了CSDN博主西部阿呆-小草屋发表的一篇文章《AIX程序设计大赛——AIX正方形问题》。该文详细阐述了AIX正方形问题的背景,并提供了一种基于Java语言的解决方案。本文将深入解析这一算法的核心思想,并展示具体的Java代码实现,旨在为参赛者和编程爱好者提供有价值的参考。 ... [详细]
author-avatar
烨伊华_348
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有