Skip to Content

main 与退出码

main 是程序的入口,有四种形态,按程序是否需要接收命令行实参选择:不需要返回值、需要返回退出码、需要接收命令行参数、以及它们的组合。

形态签名用途
最简func main()只执行,不返回、不收参
返回退出码func main() -> int返回一个可检查的结果
接收参数func main(args: string[])读命令行实参
组合func main(args: string[]) -> int两者都要

入口函数不需要可见性修饰,public 写不写都不影响运行。

退出码

-> int 形态里,return 的整数就是进程退出码:return 7 的程序,进程退出码就是 7。0 表示一切正常,非零值可以由开发者自己定含义。退出码可以检查程序是否成功结束,而不需要去解析打印内容。

$ mush run app.ms $ echo $? 0

PowerShell 查退出码用 $LASTEXITCODE,bash 用 $?。

命令行参数

给 main 加一个 args: string[] 参数,就能接收命令行实参。 执行 mush run args.ms a b c 时,args 里依次是 "a"、"b"、"c",不包括 args.ms 本身。

args.ms
func main(args: string[]) -> int { if args.Length == 0 { print("no args"); return 1; } print($"hello, {args[0]}"); return 0; }
$ mush run args.ms ada hello, ada $ echo $? 0 $ mush run args.ms no args $ echo $? 1

args 的类型 string[] 是字符串数组:args.Length 取个数,args[0] 按下标取元素,语法在下文各页展开。声明成 list<string> 同样合法,两种写法等价,语言按声明的类型传递进去:写 string[] 拿到数组,写 list<string> 拿到列表。脚本入口默认写 string[]。

注意

  • 退出码是 int;返回非 0 不算「编译错误」,只把信息交给调用方。
  • 没有显式 -> int 时程序以 0 退出。
  • args 声明为 string[] 或 list<string> 都行,入口校验只认这两个形状,其余形参写法均会在编译期拒绝。
最后更新于 2026年10月8日