在Rust中处理命令行参数和环境变量

1.摘要Rust的命令行和环境变量处理在标准库中提供了一整套实现方法, 在本文中除了探索标准库的使用方法之外, 也在不断适应Rust独有的语法特点 。在本文中, 我们通过标准库函数的返回值熟悉了迭代器的使用方法, 操作迭代器精确控制保存的内容, 包括字符串和键值对的使用方法 。
 
2.读取参数值在Rust编程中要读取命令行参数的值, 标准库提供了一个函数: std::env::args, 该函数返回一个传递给命令行参数的迭代器, 迭代器中保存了所有参数内容, 调用者需要调用collect方法将其转换成一个集合, 先看一段示例代码:
use std::env;fn mAIn() {let args: Vec<String> = env::args().collect();dbg!(args);}在上面的代码中, 首先使用use语句将std::env模块引入作用域以便使用它的args函数 。然后调用其collect()方法, 该方法将接收命令行所有参数内容并保存到变量args中, 接着使用dbg!宏打印了args的内容 。
现在将这段代码编译执行会发现没有任何内容输出, 这是因为执行运行没有参数信息, 现在我们设计一个场景, 通过search参数来搜索一个文件, 完整命令如下:
cargo run -- search filename.txt注意: 参数符号"--"与参数名之间有空格 。
执行结果如下:

在Rust中处理命令行参数和环境变量

文章插图
图片
从返回的结果来看, 集合中保存了三个参数, 实际上第一个参数是我们二进制文件名称, 这跟C语言中的参数列表的行为很类似, 除了获取到调用的程序名称, 还包括所有以空格隔开的参数名称 。
 
3.将参数值保存到变量在上面的例子中, 参数内容保存到了args变量中, 下面修改一下程序,代码如下:
use std::env;fn main() {let args: Vec<String> = env::args().collect();let param_name = &args[1];let file_name = &args[2];println!("第一个参数名:{}", param_name);println!("第二个参数名:{}", file_name);}在上面的代码中, 我们根据数组索引来取变量名称, 例如: args[0]对应是集合中的第一个元素, 也就是二进制程序名, 这个不是我们需要的, 如果要取参数search的内容, 使用args[1], 取文件名使用args[2], 以此类推 。
执行结果如下:
在Rust中处理命令行参数和环境变量

文章插图
图片
通过不同的变量分别接收不同的参数名, 在程序后面的逻辑中, 就可以使用这些保存独立参数的变量名了 。
 
4.处理环境变量在std::env模块中, 标准库同样提供了获取环境变量的函数,为: env::vars(), 下面的代码将把我这台电脑的环境变量全部打印出来:
use std::env;fn main() {for (key, value) in env::vars() {println!("{} => {}", key, value);}}同样, env::vars()返回的也是一个迭代器, 不同的是, 数据结构是以key:value对的形式保存, 程序中分别将key和value进行打印:
在Rust中处理命令行参数和环境变量

文章插图
图片
下面我们在程序中增加一项功能, 因为打印的参数实在太多, 我想把Path环境变量的内容打印出来该怎么做呢?,修改以下代码:
use std::env;fn main() {let search_key = "PATH";match env::var(search_key) {Ok(val) => {println!("PATH变量保存的内容为:{}", val);},Err(e) => println!("无法找到key:{}, 错误为:{}", search_key, e)}}在上面的代码中, 我定义了一个需要搜索的Key名为"PATH", 并使用match正则直接在env::var()的返回迭代器中搜索Key名,这里env::var(param)为什么可以接收参数呢? 进入env.rs源码可以看到以下代码:
在Rust中处理命令行参数和环境变量

文章插图
图片
env::var()接收需要搜索的Key,返回了一个Result<T, E>类型, 上面还给了一个使用的示例 。
从env:var()函数内部,我们可以看到返回的是一个Result<String, VarError>类型,因此,如果获取成功,在Ok()宏中可以设置参数接收结果,而使用Err()宏接收可能因失败返回的错误, 先看下成功的情况, 打印PATH环境变量内容如下:
在Rust中处理命令行参数和环境变量

文章插图
图片
现在再看一个搜索失败的情况, 将要搜索的key的内容修改为: "SUNTIGER", 执行结果如下:
在Rust中处理命令行参数和环境变量

文章插图
图片
此时将走另一个流程, 利用Err()宏打印错误信息 。
除此之外, std::env包中还包含其他的一些方法, 例如:设置环境变量:set_var()、删除当前运行进程的环境变量:remove_var()等,感兴趣的可以查看Rust的官方文档, 这里不再赘述 。


推荐阅读