由于对linux不是很熟,刚开始的时候就想到使用最简单的rc.local启动项和crontab来完成这个应用。写好获取权限脚本,然后在rc.local中写入它使它在其他服务项启动完后自己启动。并且写好网络检测脚本,在crontab中添加,使其每分钟运行一次,以达到断网后仍然可以重新获取权限并重新pppoe拨号。
说起来和想的一样轻巧,但是做起来对于我这个linux新手来说可是头疼得很。当时,查了各种资料发现很多人写程序都是在ubuntu等发行版系统上写C然后交叉编译的,我当时差点就要这样搞了(后来也玩了下,这是后话)。说来也巧,当时由于手头紧,我买了一个较为便宜的路由,芯片是7620A的,而我的那个大神舍友买的是网件3800,既然接受了人家的吩咐,就要两个平台都要兼顾,想想要下两个TOOLS和SDK就有点蛋疼,于是就去思考有没有什么办法可以解决这个问题的,如果有一个像shell那样在每个不管在什么平台什么linux发行版都有的脚本语言就好了。后来经过认真查找,果然有这样的脚本语言——Lua重磅出场。当我邂逅这个小巧精妙的语言时,我深深的为它所震撼了,仅仅几百KB大小的它就能够做许多常用的任务,文件操作,socket连接,协程等等,重要的是openwrt的web管理界面的后台就是完全由lua写出来。
当时发现了Lua之后,我二话不说就拿它作为该应用的开发语言了。立马上网查找它的教程,开始了Lua的学习之路。
这里简单记录一下Lua的一些特点:
- 声明的变量前没有local的都是全局变量,而且访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil(Lua中特殊的类型,他只有一个值:nil;一个全局变量没有被赋值以前默认值为nil;给全局变量赋nil可以删除该变量。)
g_name = "Alvin" --全局变量
local name = "Jack" --局部变量
print(g) -->nil
print(g_name) -->Alivin
- Lua是动态类型语言,变量不要类型定义。Lua中有8个基本类型分别为:nil、boolean、number、string、userdata、function、thread和table。函数type可以测试给定变量或者值的类型。变量没有预定义的类型,每一个变量都可能为任一种类型的值。
print(type("Hello world")) --> string
print(type(10.4*3)) --> number
print(type(print)) --> function
print(type(type)) --> function
print(type(true)) --> boolean
print(type(nil)) --> nil
print(type(type(X))) --> string
- number表示实数,Lua中没有整数,它用double来保存数值。
- Lua中字符串是不可以修改的。
- 逻辑运算符有and or not。
逻辑运算符认为false和nil是假(false),其他为真,0也是true。
and和or的运算结果不是true和false,而是和它的两个操作数相关。
而not的结果返回false或者true。
a and b -- 如果a为false,则返回a,否则返回b
a or b -- 如果a为true,则返回a,否则返回b
- C语言中的三元运算符a ? b : c在Lua中可以这样实现:(a and b) or c
- 连接运算符:两个点..
字符串连接,如果操作数为数字,Lua将数字转成字符串。
print("Hello " .. "World") --> Hello World
print(666 .. 666) --> 666666
- table的构造器是{},它的构造可以有多种形式:
t1 = {"a", "b", "c", "d"} --索引:t1[1]="a", t1[2]="b" 索引从1开始
t2 = {x=0, y=0} --也可以t2={}; t2.x=0; t2.y=0; 来构造
t3 = {['row']=0, ['column']=0} --索引:t3['row']=0, t3['column']=0
每次调用构造函数,Lua都会创建一个新的table。
在构造函数中域分隔符逗号(”,”)可以用分号(”;”)替代,通常使用分号用来分割不同类型的表元素:
{x=10, y=45; "one", "two", "three"}
- 单行注释用:“–”,多行注释用:“–[[ 这里是注释 –]]”