命令行参数可以通过 std.process.Init 获取。这个简单的解析器只遍历一次参数,并识别一个标志、 一个带值的选项和位置参数。

示例只使用 Zig 标准库,因此解析过程清晰可见,没有被第三方包隐藏。固定大小的文件列表也让内存 所有权保持简单。

const std = @import("std");

pub fn main(init: std.process.Init) !void {
    var arguments = init.minimal.args.iterate();
    _ = arguments.next();

    var verbose = false;
    var output: []const u8 = "stdout";
    var files: [8][]const u8 = undefined;
    var file_count: usize = 0;

    while (arguments.next()) |argument| {
        if (std.mem.eql(u8, argument, "--verbose")) {
            verbose = true;
        } else if (std.mem.eql(u8, argument, "--output")) {
            output = arguments.next() orelse return error.MissingOutput;
        } else {
            if (argument.len > 0) {
                if (argument[0] == '-') {
                    std.debug.print("unknown option: {s}\n", .{argument});
                    return error.UnknownOption;
                }
            }

            if (file_count == files.len) {
                return error.TooManyFiles;
            }

            files[file_count] = argument;
            file_count += 1;
        }
    }

    std.debug.print("verbose: {any}\n", .{verbose});
    std.debug.print("output: {s}\n", .{output});
    for (files[0..file_count]) |file| {
        std.debug.print("file: {s}\n", .{file});
    }
}