[toc]
## 安装
```
curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz
tar zxf lua-5.3.5.tar.gz
cd lua-5.3.5
make linux test
make install
```
****
报错:`lua.c:82:31: fatal error: readline/readline.h: No such file or directory`
方案:
`yum install readline-devel`
## 语法
1. 启动lua交互命令窗口`lua`或者`lua -i`
2. 在文件开头加入`#!/usr/local/bin/lua`可以指定按照lua脚本来运行
3. 单行注释`--`
4. 多行注释
```
--[=[注释内容]=]
```
5. 仅当一个变量不等于nil时,这个变量即存在(删除变量,将其赋值为nil)
## 数据类型
1. nil:只有nil属于这个类型,表示一个无效值
nil做比较时需要加引号
2. boolean:true/false
3. number:双精度的实浮点数
4. string:[[]]也可表示字符串
字符串连接使用`..`
计算字符串长度用#
5. function:c或者lua编写的函数
6. userdata:表示任意存储在变量中的C数据结构
7. thread:执行的独立线路,用于执行协同程序
最主要的线程是协同程序(coroutine)。它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西.
线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停
8. table:关联数组。数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表
索引用1开始
## 变量
全局变量、局部变量(local)、表中的域
1. 遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以我们可以这样进行交换变量的值(x,y = y,x)
## 循环
### while
~~~
while(condition)
do
statements
end
~~~
### for
#### 数值for循环
~~~
for var=exp1,exp2,exp3 do
end
~~~
var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次执行体。exp3 是可选的,如果不指定,默认为1
#### 泛型for循环
~~~
--打印数组a的所有值
a = {"one", "two", "three"}
for i, v in ipairs(a) do
print(i, v)
end
~~~
### repeat...until
~~~
repeat
statements
until( condition )
~~~
先执行后判断,至少执行一次。类php的do while
## 函数
1. 加local表示局部函数
### 可变参数
1. `...`
2. 使用`local arg ={...}`
## 关系运算符
不等于`~=`
## 文件IO
```
-- 以只读方式打开文件
file=io.open("test.lua","r")
-- 设置默认输入文件为 test.lua
io.input(file)
-- 输出文件第一行
print(io.read())
-- 关闭打开的文件
io.close(file)
-- 以附加的方式打开只写文件
file=io.open("test.lua","a")
-- 设置默认输出文件为 test.lua
io.output(file)
-- 在文件最后一行添加 Lua 注释
io.write("-- test.lua 文件末尾注释")
-- 关闭打开的文件
io.close(file)
```