命令行参数可以通过 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});
}
}