数据结构操作示例#
- 直接访问嵌套属性
1let user = {
2 name: "Alice",
3 profile: {
4 age: 25,
5 skills: ["rust", "javascript", "python"]
6 }
7}
8user.profile.skills@1 # 输出: "javascript"- 链式调用
11...10 | .map(x -> x * 2) | .filter(x -> x > 10)
2# 链式调用,清晰直观- 循环派发管道
1ls -1 |> print "-->" _ "<--"- 结构化管道
1df -H | Into.table() | pprint
2Fs.ls -l | where(size > 5K) | select(name,size,modified)- 错误捕获
16 / 0 ?. #忽略错误
26 / 0 ?: x -> print x #处理错误- 数据调试
1let a := (x) -> x + 1
2debug a- 映射操作
1# 映射转换
2let data = {a: 1, b: 2, c: 3}
3
4# 键值同时转换
5let result = Map.map(
6 k -> k.to_upper(), # 键转换函数
7 v -> v * 2, # 值转换函数
8 data
9)
10# 结果: {A: 2, B: 4, C: 6}实用示例#
文件处理:#
找出大于5KB且在24小时内修改过的文件,以表格显示:
1Fs.ls -l ./src/ | where(size > 5K) | where (Fs.diff('d',modified)>1) | pprint将当前目录及其子目录下的所有rs源码文件备份:
- 方式1: 使用循环派发管道
1 ls **/*.rs |> cp _ ./backup/- 方式2: 使用循环
1 for f in **/*.rs { 2 cp _ ./backup 3 }去除文件中的注释并保存
- 方式1: 函数式
1let content = Fs.read("data.txt") 2let lines = content.lines() 3let filtered = lines | List.filter(line -> !line.starts_with('#')) 4# 写入结果 5filtered.join('\n') | Fs.write("output.txt")- 方式2: 使用链式调用
1Fs.read("data.txt").lines().filter(x -> !x.starts_with('#')) >> "output.txt"- 方式2: 使用链式管道
1Fs.read("data.txt") | .lines() | .filter(x -> !x.starts_with('#')) >> "output.txt"
系统管理#
- 找出cpu占用率超过2%的用户进程,以表格显示
1 ps u -u1000 | Into.table() | where( Into.float(CPU) > 2.0 ) | pprint- 找出内存使用超过10%的进程
1ps u -u1000 | Into.table() | where( Into.float(MEM) > 10.0 ) | pprint网络操作#
- 请求json数据并解读为表格
1# HTTP 请求
2curl 'https://jsonplaceholder.typicode.com/posts/1/comments' | From.json() | pprint
3
4# 进一步筛选
5curl 'https://jsonplaceholder.typicode.com/posts/1/comments' | From.json() | where(id < 3) | select(name,email)| pprint- 请求json数据并转为其他格式保存
1let a = curl 'https://jsonplaceholder.typicode.com/posts/1/comments' | From.json()
2a >> data.json # json 格式
3a | Into.csv() >> data.csv # csv 格式
4a | Into.toml() >> data.toml # toml 格式
5
6# a 已经是Lumesh的有效表达式
7type a # List
8len(a) # 可以进行其他常规操作运维脚本#
- 写一个脚本让用户选择可挂载磁盘
1let sel = ( lsblk -rno 'name,type,size,mountpoint,label,fstype' | Into.table([name,'type',size,mountpoint,label,fstype]) \
2 | where($type!='disk' && !$mountpoint && $fstype !~: 'member') \
3 | Ui.pick "which to mount:") ?: { print 'no device selected' }
4
5if $sel {
6 let src = (sel.type == 'part' ? `/dev/${sel.name}` : `/dev/mapper/${sel.name}`)
7 let point = (sel.label==None ? sel.name : sel.label)
8 let dest = `/run/user/${id -u}/media/${point}`
9 if !Fs.exists($dest){ mkdir -p $dest }
10 sudo mount -m -o 'defaults,noatime' $src $dest ?: \
11 e -> {notify-send 'Mount Failed' $e.msg; exit 1}
12 notify-send 'Mount' `device $src mounted`
13}常用内置模块#
文件系统模块 (Fs)#
1# 目录操作
2Fs.ls("/path") # 列出目录内容
3Fs.mkdir("new_dir") # 创建目录
4Fs.rm("empty_dir") # 删除空目录
5
6# 文件操作
7Fs.read("file.txt") # 读取文件
8Fs.write("file.txt", data) # 写入文件
9Fs.append("Log.txt", entry) # 追加内容
10
11# 路径操作
12Fs.exists("/path/to/file") # 检查路径是否存在
13Fs.is_dir("/path") # 检查是否为目录
14Fs.canon("./relative/path") # 获取绝对路径系统目录访问#
1# 获取系统目录
2let dirs = Fs.dirs()
3println(dirs.home) # 用户主目录
4println(dirs.config) # 配置目录
5println(dirs.cache) # 缓存目录
6println(dirs.current) # 当前工作目录文件列表详细信息#
1# ls 命令选项
2Fs.ls -l # 详细信息
3Fs.ls -a # 显示隐藏文件
4Fs.ls -L # 跟随符号链接
5Fs.ls -u # 显示用户信息
6Fs.ls -m # 显示权限模式
7Fs.ls -p # 显示完整路径常用内置函数#
核心函数#
1# 数据操作
2len(collection) # 获取长度
3type(value) # 获取类型
4rev("string") # 反转字符串/列表
5flatten([[1,2],[3,4]]) # 扁平化嵌套结构
6
7# 执行控制
8eval(expression) # 求值表达式
9exec_str("let x = 10") # 执行字符串代码
10include("script.lm") # 包含文件到当前环境
11import("module.lm") # 导入模块到新环境数据查询和过滤#
1# 数据表格操作
2let users = [
3 {name: "Alice", age: 25, active: True},
4 {name: "Bob", age: 30, active: False},
5 {name: "Carol", age: 35, active: True}
6]
7
8# 过滤行
9let active_users = where(active, users)
10
11# 选择列
12let names_ages = select(name, age, users)命令执行系统#
外部命令执行#
Lumesh 支持多种命令执行模式:
1# 基本命令执行
2ls -la
3
4# 后台执行
5command &
6
7# 静默执行
8command &-PTY 支持#
对于需要终端交互的程序,Lumesh 提供 PTY 支持:
1# 自动判断并启用PTY模式
2ls -l | vi
3
4# 强制PTY 模式(交互式程序), 一般无需如此
5ls -l |^ vi
6'' |^ vi 'file.txt'脚本执行#
脚本运行器#
Lumesh 提供两种执行模式:
1# 直接执行命令
2lumesh -c "print 'Hello World'"
3
4# 执行脚本文件
5lumesh script.lm arg1 arg2
6
7# 脚本中访问参数
8println(argv[0]) # 第一个参数测试示例#
1#!/usr/bin/env lumesh
2
3# 测试函数
4fn assert(actual, expected, test_name) {
5 if actual != expected {
6 print "[FAIL]" test_name "| 实际:" actual "| 预期:" expected
7 } else {
8 print "[PASS]" test_name
9 }
10}
11
12# 变量赋值测试
13let x = 10
14assert(str(x), "10", "单变量赋值")
15
16# 延迟赋值测试
17x := 2 + 3
18assert(eval(x), 5, "延迟赋值求值")日志系统#
日志级别管理#
1# 设置日志级别
2Log.set_level(Log.level.info) # 设置为 INFO 级别
3
4# 检查日志级别
5if Log.enabled(1) {
6 Log.debug("调试已开启")
7}
8Log.info("调试信息")
9
10# 禁用日志
11Log.disable()了解更多: