Linux&C – 精华Linux–QQ群: 490921612

Lua File exists create read write

Files={
    Func = function(file,rw)
       local f = io.open(file, rw)
       if f == nil then
           return false;
       else
          f:close()
          return true;
       end
    end,
    
    Exists = function(file)
      return Files.Func(file,"r")
    end,

    CanRead = function(file)
      return Files.Func(file,"r")
    end,
    
    Create = function(file)
      return Files.Func(file,"w")
    end,
    
    CanWrite = function(file)
      return Files.Func(file,"w")
    end,
    
    CanReadWrite = function(file)
        if not Files.Exists(file) then
            return false
        else 
            return Files.CanWrite(file)
        end
    end
}

print( Files.CanRead("/tmp/ipxxxxx.log"))
print( Files.CanWrite("/tmp/ipxxxxx.log"))
 

nginx lua log ip to file

    location /abc {
        access_by_lua '
            local io = require("io")
            local f = io.open("/tmp/x.txt", "a")
            f:write(ngx.now(),":", ngx.var.remote_addr,"\\n" ) //此处使用,即逗号来进行字符串拼接
            f:close()
        ';
    }
 

Lua

.基础数据类型
nil
变量无值时默认为nil, 无效值

local age = 30
print(age)

local ok=true
local ok=false
local c=nil

if ok then
   print("ok")
else
   print("not ok")
fi

local obj = {
   name="abc",
   age=20,
   status={"online","offline","unkown"},
   [“city”] = "Beijing"
}

print(obj.name)
print(obj[“city”])
print(obj.status[1])

.函数
local function foo()
  print("in the function")
  local x=10
   local y=20
   return x+y
end

local foo = function()
  …
end

.表达式
 print(1+2)
 print(5/2)
 print(5%2)
 print(2^10)
 print((5%2) == 1)

.关系运算
 < > <= >= == ~=

 and or not

 + – * / %

.字符串
 连接
 print("hello " … "world" .. age)
 str=string.format("%s – %s %d","hello","world",age)
 print(str)

local pieces = {}
for i, elem in ipairs(my_list) do
    pieces[i] = my_process(elem)
end
local res = table.concat(pieces)

////////////////////////////////

local a, b = 1, 2
local x, y = 3, 4
local i = 10
local res = 0
res = a + i < b/2 + 1  –>等价于res =  (a + i) < ((b/2) + 1)
res = 5 + x^2*8        –>等价于res =  5 + ((x^2) * 8)
res = a < y and y <=x  –>等价于res =  (a < y) and (y <= x)

////////////////////////////////

x = 10
if x > 0 then
    print("x is a positive number")
end

 

x = 10
if x > 0 then
    print("x is a positive number")
else
    print("x is a non-positive number")
end


score = 90
if score == 100 then
    print("Very good!Your score is 100")
elseif score >= 60 then
    print("Congratulations, you have passed it,your score greater or equal to 60")
--此处可以添加多个elseif
else
    print("Sorry, you do not pass the exam! ")
end

////////////////////////////////

x = 1
sum = 0

while x <= 5 do
    sum = sum + x
    x = x + 1
end
print(sum)  -->output 15


local t = {1, 3, 5, 8, 11, 18, 21}

local i
for i, v in ipairs(t) do
    if 11 == v then
        print("index[" .. i .. "] have right value[11]")
        break
    end
end

////////////////////////////////

score = 0
if score == 100 then
    print("Very good!Your score is 100")
elseif score >= 60 then
    print("Congratulations, you have passed it,your score greater or equal to 60")
else
    if score > 0 then
        print("Your score is better than 0")
    else
        print("My God, your score turned out to be 0")
    end --与上一示例代码不同的是,此处要添加一个end
end

x = 10
repeat
    print(x)
until false

////////////////////////////////

for var = begin, finish, step do
    --body
end

for i = 1, 5 do
  print(i)
end


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


for i = 10, 1, -1 do
  print(i)
end


for i = 1, math.huge do
    if (0.3*i^3 - 20*i^2 - 500 >=0) then
      print(i)
      break
    end
end

////////////////////////////////

-- 打印数组a的所有值
local a = {"a", "b", "c", "d"}
for i, v in ipairs(a) do
  print("index:", i, " value:", v)
end


-- 打印table t中所有的key
for k in pairs(t) do
    print(k)
end

////////////////////////////////

local days = {
  "Sunday", "Monday", "Tuesday", "Wednesday",
  "Thursday", "Friday", "Saturday"
}


local revDays = {
    ["Sunday"] = 1,
    ["Monday"] = 2,
    ["Tuesday"] = 3,
    ["Wednesday"] = 4,
    ["Thursday"] = 5,
    ["Friday"] = 6,
    ["Saturday"] = 7
  }


local x = "Tuesday"
print(revDays[x])  -->3

local days = {
   "Monday", "Tuesday", "Wednesday", "Thursday",
   "Friday", "Saturday","Sunday"
}

////////////////////////////////

local revDays = {}
for k, v in pairs(days) do
  revDays[v] = k
end


-- print value
for k,v in pairs(revDays) do
  print("k:", k, " v:", v)
end

////////////////////////////////

print("hello world!")        -- 用 print() 函数输出 hello world!
local m = math.max(1, 5)     -- 调用数学库函数 max,

////////////////////////////////

function foo.bar(a, b, c)
    -- body ...
end

此时我们是把一个函数类型的值赋给了 foo 表的 bar 字段。换言之,上面的定义等价于
foo.bar = function (a, b, c)
    print(a, b, c)
end

////////////////////////////////

local function swap(a, b) --定义函数swap,函数内部进行交换两个变量的值
   local temp = a
   a = b
   b = temp
   print(a, b)
end


local x = "hello"
local y = 20
print(x, y)
swap(x, y)    --调用swap函数
print(x, y)   --调用swap函数后,x和y的值并没有交换


////////////////////////////////

local function fun1(a, b)       --两个形参,多余的实参被忽略掉
   print(a, b)
end


local function fun2(a, b, c, d) --四个形参,没有被实参初始化的形参,用nil初始化
   print(a, b, c, d)
end


////////////////////////////////

local function func( ... )                -- 形参为 ... ,表示函数采用变长参数

   local temp = {...}                     -- 访问的时候也要使用 ...
   local ans = table.concat(temp, " ")    -- 使用 table.concat 库函数对数
                                          -- 组内容使用 " " 拼接成字符串。
   print(ans)
end

func(1, 2)        -- 传递了两个参数
func(1, 2, 3, 4)  -- 传递了四个参数

////////////////////////////////

local function change(arg) -- change 函数,改变长方形的长和宽,使其各增长一倍
  arg.width = arg.width * 2
  arg.height = arg.height * 2
  return arg
end


////////////////////////////////

local rectangle = { width = 20, height = 15 }
print("before change:", "width  =", rectangle.width,
                        "height =", rectangle.height)
rectangle = change(rectangle)
print("after  change:", "width  =", rectangle.width,
                        "height =", rectangle.height)


-->output
before change: width = 20  height =  15
after  change: width = 40  height =  30

function change(arg) --change函数,改变长方形的长和宽,使其各增长一倍
  arg.width = arg.width * 2  --表arg不是表rectangle的拷贝,他们是同一个表
  arg.height = arg.height * 2
end                  -- 没有return语句了


////////////////////////////////

local rectangle = { width = 20, height = 15 }
print("before change:", "width = ", rectangle.width,
                        " height = ", rectangle.height)
change(rectangle)
print("after change:", "width = ", rectangle.width,
                       " height =", rectangle.height)

--> output
before change: width = 20  height = 15
after  change: width = 40  height = 30


////////////////////////////////

local s, e = string.find("hello world", "llo")
print(s, e)  -->output 3  5

////////////////////////////////

local function swap(a, b)   -- 定义函数 swap,实现两个变量交换值
   return b, a              -- 按相反顺序返回变量的值
end

local x = 1
local y = 20
x, y = swap(x, y)           -- 调用 swap 函数
print(x, y)        


////////////////////////////////

function init()             --init 函数 返回两个值 1 和 "lua"
  return 1, "lua"
end

x = init()
print(x)

x, y, z = init()
print(x, y, z)

local function init()       -- init 函数 返回两个值 1 和 "lua"
    return 1, "lua"
end

local x, y, z = init(), 2   -- init 函数的位置不在最后,此时只返回 1
print(x, y, z)              -->output  1  2  nil

local a, b, c = 2, init()   -- init 函数的位置在最后,此时返回 1 和 "lua"
print(a, b, c)      


////////////////////////////////

local function init()
    return 1, "lua"
end

print(init(), 2)   -->output  1  2
print(2, init())   -->output  2  1  lua


////////////////////////////////

local function init()
    return 1, "lua"
end

print((init()), 2)   -->output  1  2
print(2, (init()))   -->output  2  1


////////////////////////////////

local args = {...} or {}
method_name(unpack(args, 1, table.maxn(args)))


local function run(x, y)
    print('run', x, y)
end

local function attack(targetId)
    print('targetId', targetId)
end

local function do_action(method, ...)
    local args = {...} or {}
    method(unpack(args, 1, table.maxn(args)))
end

do_action(run, 1, 2)         -- output: run 1 2
do_action(attack, 1111)      -- output: targetId    1111


////////////////////////////////

local foo={}

local function getname()
    return "Lucy"
end

function foo.greeting()
    print("hello " .. getname())
end

return foo

local fp = require("my")
fp.greeting()     -->output: hello Lucy

////////////////////////////////

local color={first="red", "blue", third="green", "yellow"}
print(color["first"])                 --> output: red
print(color[1])                       --> output: blue
print(color["third"])                 --> output: green
print(color[2])                       --> output: yellow
print(color[3])                       --> output: nil