一、浅谈命令行参数
我们的main函数正常来说是没有参数的,其实我们也可以给我们的main函数加上参数。main函数的第一个参数为argc,参数类型为int,第二个参数为argv,参数类型为char*类型的指针数组(也叫命令行参数表),该指针数组以NULL结尾。当我们在命令行解释器输入一串指令时,命令行解释器会将这一串指令当成一个字符串,并以空格作为分隔符,将这个字符串分割成更小的字符串,并将这些更小的字符串分别存到argv数组中。main函数的argc和argv参数是由命令行解释器(通常是操作系统的shell/bash)维护的。当你从命令行运行一个程序时,命令行解释器会负责解析命令行中的各个部分,包括程序名(即argv[0])和传递给程序的任何选项(即argv[1]、argv[2]等)。解释器还会计算选项的数量,并将其作为argc的值传递给main函数。命令行解释器会负责将这些信息正确地传递给程序的main函数,以便程序能够使用它们。
1 #include <stdio.h> 2 3 int main(int argc, char* argv[]) 4 { 5 int i = 0; 6 for(i = 0; i<argc; i++) 7 { 8 printf("%d, %s\n", i, argv[i]); 9 } 10 return 0; 11 }
有了命令行参数表,我们就可以通过在命令行中传不同的选项,让我们的同一个程序执行它内部不同的功能。这也就可以解释为什么同一条指令我们在命令行中传递不同的选项它可以帮我们执行不同的功能。所以选项的本质就是命令行参数。命令行参数,是Linux指令选项的基础。
二、环境变量
2.1环境变量的内涵以及理解
环境变量是很多的变量,彼此之间没有关系。环境变量一般是系统内置的,具有特殊用途的变量。 系统的环境变量,本质就是系统自己开辟空间,给这块空间名字和内容即可。环境变量具有全局属性,会被所有子进程包括孙子进程继承。所有我们目前看到的环境变量都是内存级的,都保存在bash的上下文中,bash继承退出了,这些内存级的环境变量自然就没了。所以系统的环境变量最初始一定都是保存在磁盘当中的,当一个bash进程启动时,再从磁盘中读取相应的环境变量,在内存中形成环境变量表,所以下面讲到的export命令是在内存级的环境变量表中加入环境变量,不会改变内存中的环境变量。这也是为什么我们每次修改了环境变量的值,但是当我们重新启动bash环境变量又恢复成原来的环境变量的原因。
2.2PATH环境变量:
在系统当中,存在一个全局的环境变量,叫做PATH,保存的是我们的操作系统默认的搜索可执行程序的搜索路径。当我们执行某一条指令的时候,系统默认会到PATH环境变量保存的目录中去搜索指令对应的可执行程序(这里我们必须清楚的是,Linux中指令的本质就是可执行程序)。查询PATH变量的方法:
echo $PATH
上面的路径以冒号作为分隔符。我们平常所用的指令对应的可执行程序已经被存放到了系统环境变量对应的目录中。所以我们平常只需要输入指令就可以正常运行,系统默认会到指定的目录中去找你输入的指令。而我们自己写的可执行程序由于没有放到系统对应的保存环境变量的目录中,所以我们的可执行程序要运行必须在程序名前加上./或者是指定路径名,才能让系统找到我们的程序。which在搜索的时候就是根据PATH对应的路径去找的。
2.3输入程序名就能运行我们的程序
为了输入程序名就能运行我们的程序,我们有两种做法:
1、添加某段路径到PATH变量中
PATH=路径:$PATH
2、将我们的程序直接拷贝到PATH变量对应的路径中。
2.4系统中的环境变量
env:查看此时系统中的环境变量
2.5导出环境变量
export :导入到bash的环境变量表中
假如我向系统中导入一个AGE的环境变量
再用env查询,系统中就多了一个AGE环境变量。
三、main函数的第三个参数
其实main函数最多可以传递三个参数,第三个参数叫env,参数类型同样为char*的指针数组,env数组中保存的正是该进程拥有的环境变量。命令行解释器/bash进程内部自己维护了一张表,env表,env表中每一个位置都指向了一个环境变量,我们自己运行起来的进程都是bash的子进程(不考虑fork),当我们的程序运行起来时,bash进程会把它维护的env表的起始地址传递给我们程序的main函数的env参数,此时我们的进程也就拿到了父进程给我们的环境变量。所以,环境变量是可以被子进程继承的。
3.1获得环境变量的三种方法
1、通过main函数参数env
2、通过getenv函数
3、通过第三方environ参数
四、本地变量
不能通过env命令查看,可以通过set命令查看。本地变量无法被子进程继承。