一、基本概念对比
#| 概念 | Bash 语法 | Lumesh 语法 | 说明 |
|---|
| 解释器声明 | #!/bin/bash | #!/usr/bin/env lumesh | Lumesh 推荐使用 env 方式调用 |
| 注释 | # 注释内容 | # 注释内容 | 与 Bash 相同 |
| 续行符 | \ | \ | 与 Bash 相同,但字符串内不需要续行符 |
二、变量操作对比
#| 操作 | Bash 语法 | Lumesh 语法 | 说明 |
|---|
| 变量声明 | var=value | let var = value | 空格可选,严格模式才必须声明 |
| 变量引用 | "$var" 或 "${var}" | $var 或直接 var | $可选,严格模式才必须$ |
| 多变量声明 | 不支持 | let a, b = 1, 2 | |
| 删除变量 | unset var | del var | |
| 延迟赋值 | 不支持 | x := 2 + 3 | |
| 类型检查 | 不支持 | typeof var == "Integer" | |
| 解构赋值 | 不支持 | let [a,b] = arr | |
Bash变量通常需要双引号,才能避免空值导致的语法错误。
三、数据类型对比
#| 类型 | Bash 处理方式 | Lumesh 语法 | 说明 |
|---|
| 整数 | declare -i var=10 | let var = 10 | 自动分配类型 |
| 浮点数 | 不支持 | let var = 10.0 | |
| 字符串 | str="hello" | let str = "hello" | |
| 数组 | arr=(1 2 3) | let arr = [1, 2, 3] 或 1...<3 | |
| 字典 | declare -A dict=([k]=v) | let dict = {k: v} | |
| 范围 | {1..10} | 1..10 或 1..<10 | 属于基础数据类型,可参与运算 |
| 文件大小 | 字符串 | 200M | 属于基础数据类型,可参与运算 |
| 时间 | 字符串 | r'2025-10-1' | 属于基础数据类型,可参与运算 |
四、运算符对比
#| 运算符 | Bash 语法 | Lumesh 语法 | 说明 |
|---|
| 算术运算 | $((a + b)) | a + b | 直接运算 |
| 字符串连接 | "$a$b" | `$a$b` 或 a + b | 也可使用String.format |
| 相等比较 | [ "$a" == "$b" ] | a == b 或 a ~= b | 跨类型比较~= |
| 包含检查 | [[ "str" =~ "pattern" ]] | str ~: 'pattern' | 包含运算可用于数组,范围,字典,字符串 |
| 正则匹配 | [[ "str" =~ "regex" ]] | str ~: r'regex' | 有正则库regex可用 |
Bash比较需要双引号,才能避免空值导致的语法错误。
五、流程控制对比
#| 结构 | Bash 语法 | Lumesh 语法 | 说明 |
|---|
| if 语句 | if [ cond ]; then ... fi | if cond {...} else {...} | 更简洁 |
| for 循环 | for i in {1..3}; do ... done | for i in 1..3 {...} | 更简洁 |
| while 循环 | while [ cond ]; do ... done | while cond {...} | 更简洁 |
| case 语句 | case $var in; a) a_cmd;; ... esac | match var { a => a_cmd...} | Match 语句更简洁,且支持正则 |
| repeat 循环 | 无直接对应 | repeat 10 {...} | repeat 循环,是list.map的别名 |
| each 循环 | 无直接对应 | `each {} [1..3] | 是list.map的别名 |
六、函数对比
#| 功能 | Bash 语法 | Lumesh 语法 | 说明 |
|---|
| 函数定义 | func() { cmds; } | fn func() {...} | |
| 匿名函数 | 不支持 | let f = (x,y) -> x + y | lambda表达式 |
| 函数参数 | 不支持 | fn func(a,b) { a,b...} | 形参列表 |
| 默认参数 | 不支持 | fn f(a=1) {...} | 默认参数 |
| 剩余参数 | 不支持 | fn f(*args) {...} | 剩余参数收集 |
| 函数调用 | func a1 | func(a1) 或 func! a1 | |
| 高阶函数 | 不直接支持 | funcA(funcB) | 函数作为参数 |
| 作用域 | 只支持全局作用域 | 函数具有隔离作用域 | |
Bash没有函数形参,只能使用位置参数$1...,如传递了位置参数,将覆盖脚本级参数。
六、脚本参数
#| 功能 | Bash 语法 | Lumesh 语法 | 说明 |
|---|
| 参数 | "$1" "$2" ... | argv[0] argv[1] | |
| 所有参数 | "$@" | argv | |
| 参数数量 | "$#" | argv.len() | |
七、系统命令对比
#| 操作 | Bash 语法 | Lumesh 语法 | 说明 |
|---|
| 命令执行 | cmd | cmd | |
| 后台运行 | cmd & | cmd & | |
| 关闭输出 | cmd >/dev/null | cmd &- | |
| 关闭错误 | cmd 2>/dev/null | cmd &? | |
| 管道 | cmd1 | cmd2 | `cmd1 | cmd2 | 与Bash相同,但支持结构化数据流 |
| 重定向追加 | cmd >> file | cmd >> file | 与Bash相同 |
| 重定向覆盖 | cmd > file | cmd >! file | |
八、高级特性对比
#| 特性 | Bash 支持情况 | Lumesh 支持情况 | 说明 |
|---|
| 隐式类型转换 | 无 | 自动转换数字和字符串 | |
| 运算符重载 | 无 | 支持多种类型的加减乘除 | |
| 矩阵运算 | 无 | 支持矩阵乘法 | |
| 错误提示 | 粗略 | 细致 | 会提示行号和上下文及错误类型 |
| 错误处理 | 仅$?状态码检测 | 支持异常捕获、忽略、打印等 | 更便捷的异常处理机制 |
| 交互模式 | 支持 | 语法高亮,自动完成,AI辅助,按键绑定 | 增强的REPL 交互模式 |
| 内置Lib库 | 无 | 内置大量实用函数 | 参见Libs |
| 结构化管道 | 无 | 支持Into | where | select 等便捷数据处理 | |
九、迁移建议
#- 变量声明:从
var=value 可保持原样,严格模式应将首次声明改为 let var = value - 条件判断:从
[ "$a" == "$b" ] 改为 a == b 或 $a == $b - 循环语句:从
for i in {1..10} 改为 for i in 1..10 - 函数定义:从
func() {...} 改为 fn func() {...} - 错误处理:从
cmd || fallback 可保持原样或改为 cmd ?: fallback
十、注意事项
#- Lumesh 的数组索引从 0 开始(与 Bash 相同)
- 范围表达式
a..<b 不包含 b,a..b 包含 b - 函数调用需要加
() 或 ! 后缀 - 严格模式下必须使用
$ 前缀引用变量 - 运算符优先级可能与 Bash 有所不同
十一、学习资源
#- 官方文档:Lumesh 语法手册
- 交互教程:运行
lumesh 进入 REPL 模式练习