命令行参数
main 函数可以有参数吗?可以有几个参数呢?参数又是什么呢?
int main(int argc, char *argv[]) {
printf("hello linux!\n");
return 0;
}
我们或多或少在别人的程序中见过这种代码,清楚 main 函数是可以带参数的,并且可以有两个参数(实际上可以有 3 个参数,第 3 个是环境变量表)。那么这两个参数各代表什么含义呢?
argv 是一个指针数组,它指向一个一个的字符串,最后以 NULL 结尾;argc 用来记录 argv[] 的元素个数。
我们的命令行参数会放到命令行参数表上,即 argv,它用来存储命令行参数的每个单独的字符串。

意义
为什么要有命令行参数表呢?它能带来的意义又有哪些呢?
命令行参数传递:借助主函数的参数,能把命令行中用户输入的参数传递到程序内部,这样程序就能依据不同参数执行不同操作。程序灵活性提升:无需对代码进行修改,通过命令行参数就能改变程序的运行方式或者配置信息。
下图展示了一段程序,它借助 main 函数参数,让命令行参数传递的时候,通过匹配不同的命令行参数,如果第二个参数带的是 v1 则实现 v1 版本,带的是 v2 则实现 v2 版本,从而实现不同版本的逻辑。这带来的意义就是命令行参数传递实现不同的逻辑,同时我们也可以限制如果传递的命令行参数不符合我们的逻辑,则不能通过,提升了程序灵活性。

有没有一种可能我们之前所说的选项就是这样实现的呢?是的没有错,Linux 中许多指令也是借助了命令行参数才得以支持多模块实现,如 ls 指令。
ls -l -a -i
ls 的命令本质是一个程序,而我们之前说 ls 后面的是选项,今天我们对选项能有更深的理解,它是通过命令行参数匹配从而实现我们的目的。
-l、-a 本质是字符串,以一定的方式传递给 ls 内部的"main",在 ls 内部实现的时候,就可以根据不同的选项,实现类似功能的不同表现形式。
因此我们对指令又有了进一步的理解:指令是特定目录上执行的二进制程序,而选项则是根据不同的参数传递给"main",实现不同表现形式。
环境变量
引出概念:
- 环境变量 (environment variables) 一般是指在操作系统中用来指定操作系统运行环境的一些参数。如:我们在编写 C/C++ 代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
- 环境变量是系统级别的一些全局变量,具备不同的用途(这也是为什么要有环境变量的原因)。













