Lua 脚本语言入门
2026/1/14大约 4 分钟
Lua 脚本语言入门
Lua 是一种轻量级、高效的脚本语言,广泛应用于游戏开发、嵌入式系统、Redis 脚本等领域。
一、Lua 简介
特点
- 轻量级:完整解释器仅 200KB 左右
- 高效:运行速度快,接近 C 语言
- 可嵌入:易于嵌入到其他程序中
- 简洁:语法简单,易于学习
应用场景
| 领域 | 应用 |
|---|---|
| 游戏开发 | 魔兽世界、愤怒的小鸟等游戏脚本 |
| Web 服务 | OpenResty/Nginx 扩展 |
| 数据库 | Redis 脚本 |
| 嵌入式 | 物联网设备配置 |
二、环境安装
Windows
下载地址:https://github.com/rjpcomputing/luaforwindows/releases
或使用 Scoop:
scoop install luaLinux
# Ubuntu/Debian
sudo apt install lua5.4
# CentOS
sudo yum install luamacOS
brew install lua验证安装:
lua -v三、基础语法
1. Hello World
print("Hello, Lua!")运行:lua hello.lua
2. 变量与数据类型
-- 单行注释
--[[
多行注释
]]
-- 变量(默认全局,local 声明局部变量)
local name = "Lua"
local age = 30
local isActive = true
local nothing = nil
-- 数据类型
print(type("Hello")) -- string
print(type(123)) -- number
print(type(true)) -- boolean
print(type(nil)) -- nil
print(type({})) -- table
print(type(print)) -- function3. 字符串操作
local str1 = "Hello"
local str2 = 'World'
local str3 = [[
多行
字符串
]]
-- 字符串连接
local result = str1 .. " " .. str2
print(result) -- Hello World
-- 字符串长度
print(#str1) -- 5
-- 常用函数
print(string.upper("hello")) -- HELLO
print(string.lower("HELLO")) -- hello
print(string.len("hello")) -- 5
print(string.sub("hello", 1, 3)) -- hel
print(string.find("hello", "ll")) -- 3 4
print(string.gsub("hello", "l", "L")) -- heLLo4. 运算符
-- 算术运算符
print(10 + 3) -- 13
print(10 - 3) -- 7
print(10 * 3) -- 30
print(10 / 3) -- 3.333...
print(10 % 3) -- 1
print(10 ^ 2) -- 100(幂运算)
print(10 // 3) -- 3(整除,Lua 5.3+)
-- 关系运算符
print(1 == 1) -- true
print(1 ~= 2) -- true(不等于用 ~=)
print(1 < 2) -- true
-- 逻辑运算符
print(true and false) -- false
print(true or false) -- true
print(not true) -- false5. 条件语句
local score = 85
if score >= 90 then
print("优秀")
elseif score >= 60 then
print("及格")
else
print("不及格")
end6. 循环语句
-- while 循环
local i = 1
while i <= 5 do
print(i)
i = i + 1
end
-- for 循环(数值型)
for i = 1, 5 do
print(i)
end
-- for 循环(带步长)
for i = 1, 10, 2 do
print(i) -- 1, 3, 5, 7, 9
end
-- repeat...until 循环
local j = 1
repeat
print(j)
j = j + 1
until j > 5四、Table(表)
Table 是 Lua 中唯一的数据结构,可以实现数组、字典、对象等。
1. 数组
-- 数组(索引从 1 开始!)
local arr = {"apple", "banana", "cherry"}
print(arr[1]) -- apple
print(#arr) -- 3(长度)
-- 遍历数组
for i, v in ipairs(arr) do
print(i, v)
end
-- 添加元素
table.insert(arr, "orange")
table.insert(arr, 2, "grape") -- 插入到位置2
-- 删除元素
table.remove(arr, 1) -- 删除第一个2. 字典(键值对)
local user = {
name = "张三",
age = 25,
city = "北京"
}
-- 访问
print(user.name) -- 张三
print(user["age"]) -- 25
-- 修改
user.age = 26
-- 添加
user.email = "zhangsan@example.com"
-- 遍历
for k, v in pairs(user) do
print(k, v)
end3. 混合使用
local data = {
"first", -- data[1]
"second", -- data[2]
name = "test", -- data.name
count = 100 -- data.count
}五、函数
1. 基本定义
-- 普通函数
function greet(name)
return "Hello, " .. name
end
print(greet("Lua"))
-- 局部函数
local function add(a, b)
return a + b
end
-- 匿名函数
local multiply = function(a, b)
return a * b
end2. 多返回值
function getMinMax(arr)
local min, max = arr[1], arr[1]
for _, v in ipairs(arr) do
if v < min then min = v end
if v > max then max = v end
end
return min, max
end
local min, max = getMinMax({3, 1, 4, 1, 5, 9})
print(min, max) -- 1 93. 可变参数
function sum(...)
local args = {...}
local total = 0
for _, v in ipairs(args) do
total = total + v
end
return total
end
print(sum(1, 2, 3, 4, 5)) -- 15六、模块
创建模块
-- mymodule.lua
local M = {}
function M.sayHello(name)
print("Hello, " .. name)
end
function M.add(a, b)
return a + b
end
return M使用模块
local mymodule = require("mymodule")
mymodule.sayHello("World")
print(mymodule.add(1, 2))七、Redis 中使用 Lua
Redis 支持 Lua 脚本,保证原子性执行。
基本语法
-- 获取参数
local key = KEYS[1]
local value = ARGV[1]
-- 调用 Redis 命令
redis.call('SET', key, value)
local result = redis.call('GET', key)
return result执行脚本
# 命令行执行
redis-cli EVAL "return redis.call('GET', KEYS[1])" 1 mykey
# 从文件执行
redis-cli --eval script.lua key1 key2 , arg1 arg2实战:分布式锁
-- lock.lua
local key = KEYS[1]
local value = ARGV[1]
local ttl = ARGV[2]
-- 尝试获取锁
if redis.call('SETNX', key, value) == 1 then
redis.call('EXPIRE', key, ttl)
return 1
end
return 0-- unlock.lua
local key = KEYS[1]
local value = ARGV[1]
-- 验证并释放锁
if redis.call('GET', key) == value then
return redis.call('DEL', key)
end
return 0实战:限流器
-- rate_limit.lua
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local current = tonumber(redis.call('GET', key) or 0)
if current < limit then
redis.call('INCR', key)
if current == 0 then
redis.call('EXPIRE', key, window)
end
return 1 -- 允许
end
return 0 -- 拒绝