传奇网站制作网,常熟住房和城乡建设局网站,百度seo免费推广教程,seo 网站地图优化命令行参数 什么是命令行参数
命令行参数是指在执行命令行程序时#xff0c;给程序传递的额外参数。在Linux终端中#xff0c;命令行参数通常通过在命令后面添加空格分隔的参数来传递。
Linux下以main函数举例说明 #includestdio.hint main(int argc char* argv[])… 命令行参数 什么是命令行参数
命令行参数是指在执行命令行程序时给程序传递的额外参数。在Linux终端中命令行参数通常通过在命令后面添加空格分隔的参数来传递。
Linux下以main函数举例说明 #includestdio.hint main(int argc char* argv[])//命令行参数{int i0;for(i0;iargc;i){printf(%s\n,argv[i]); } return 0; } 运行结果 解释说明 其实main函数也是被其他函数调用的而且mian函数有两个默认参数的也就是命令行参数的一种。一个是整型argc指的是命令行参数数量。另一个是指针数组argv存储的是传递给程序的命令行参数argv[0]通常是程序的名称或路径argv[1]开始是实际的命令行参数。命令行启动一个程序中会以空格为分隔符shell或者OS会自动帮我们的命令选项看做字符串的形式作为参数传递到我们的程序中也就是被main函数的第二个参数argv接收而参数的个数也被argc接收。 所以以下实现的例子也就说得通了 为什么要有命令行参数
命令行参数允许我们在运行程序时向程序传递一些数据或配置信息。这些参数允许程序在运行时动态地接收输入而不是让程序固定化。
所以说如果我们想通过一个程序的命令行参数来讲该程序拓展配置的话此时命令行参数就起到了很大的作用。
Linux下实现简易calculator 1: //calculator.c ⮀ ⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂⮂ 1 #includestdio.h2 #includestring.h3 #includestdlib.h4 int main(int argc,char* argv[])5 {6 if(argc!4)7 {8 printf(输入非法请使用add sub mul div\n);9 return 1;10 }11 int left atoi(argv[2]);12 int right atoi(argv[3]);13 if(strcmp(argv[1],-add)0)14 printf(add%d\n,leftright);15 else if(strcmp(argv[1],-sub)0)16 printf(sub%d\n,left-right);17 else if(strcmp(argv[1],-mul)0)18 printf(add%d\n,left*right);19 else if(strcmp(argv[1],div)0right!0)20 printf(div%d\n,left/right); 21 22 return 0;23 }如果把这可执行程序 ./a.out换成calculate不就更加醒目了嘛。
其实我们linux下的大部分指令都是通过通过对可执行程序的命令行参数进行if-else从而实现的。就像ls-l以及ls-al...就是典型的可执行程序形成的命令行指令而后面的选项就是命令行参数被shell打散成子串被程序接收。从而达到同一个程序可以实现不同的功能的作用。 命令行参数类型
选项参数Options以-或--开头用来标识命令的不同选项或功能。 例如ls -l -a表示使用长格式显示所有文件和目录包括隐藏文件。参数值参数Arguments不带-或--的额外参数用于给命令提供一些特定的值或数据。 例如cp file1.txt file2.txt表示将file1.txt复制为file2.txt。 环境变量
环境变量是在操作系统中定义的一些变量用来保存一些系统或用户的配置信息。它们是一种在系统运行时可以动态改变的值可以在不同的应用程序之间进行共享和传递。
命令行的类型 可执行程序这些是真正的可执行程序它们是由编译过的源代码生成的二进制文件。例如ls、cp、mv等命令都是可执行程序。 内置命令这些是由shell如bash内置的命令它们直接嵌入在shell解释器中而不是作为独立的可执行文件存在。例如cd、echo、pwd等命令都是内置命令。 别名alias这些是用户定义的命令别名可以简化常用命令的使用。用户可以用alias命令定义自己的别名以更方便地执行命令。例如用户可能定义alias llls -l来替代原始的ls命令。 我们知道有的命令行是可执行程序有的命令行是内置命令另外一种就是命令取别名。而上面我们自己实现的calculate可执行程序也可以看做命令。但是我们执行时要带./ 是因为执行一个命令需要找到对应程序的路径。所以在当前目录下我们写的程序都要带上./才能执行 但是为什么我们linux下的可执行程序命令不用带路径也可以执行呢
其实linux下的指令是有默认搜索路径的也就是当你使用该指令时linux会自动在默认路径里面去找而该默认路径是什么呢其实这就与环境变量PATH有关。 PATH
在linux系统中存在环境变量可以记录系统中可执行程序的搜索路径该环境变量也就是PATH用于指定可执行程序的搜索路径当输入一个不带路径的命令时系统会默认在PATH的内容中按照顺序在路径列表中查找可执行程序的所在路径。
查看
我们可以通过echo $变量名的方式来查看该环境变量的值 解释作用
所以解释一下linux的ls指令当我们执行命令时默认就在PATH环境变量里以冒号作为分隔符依次在以下路径中查找ls命令找到了该可执行程序也就可以运行了。所以说我们自己的可执行程序要带上路径才能执行就是因为我们的程序不在PATH环境变量下的路径当中。
所以说如果我们想要自己的程序也可以不带路径直接运行的话就应该将我们程序所在路径放到环境变量PATH中。可以增加路径也可以将可执行程序拷贝到PATH里任意原有路径。
更改PATH内容
PATH$PATH:可执行程序所在路径//将我们的程序拼接到PATH环境变量下的路径中
//$PATH就是原来环境变量下的内容
//:就是分隔符连续两个路径是靠作为分隔符
所以PATHxxxxxxx是什么环境变量PATH内容就是什么 其实我们linux下的which命令就是在环境变量PATH里面去找命令所在路径的。
简易安装卸载程序
其实我们将写好的可执行程序拷贝到PATH里的其中一个路径里的过程就相当于安装程序的过程 其实卸载就相当于在该路径下删除该程序 PWD
PWD环境变量当前工作目录的路径。我们使用的pwd命令就是读取该环境变量里的内容。
HOME
HOME环境变量指示当前用户的主目录。当我们使用不同身份登录xshell时HOME环境变量就识别你是普通用户还是root用户然后根据你的用户名来初始化HOME环境变量里的内容。 获取环境变量的方法
getenv
我们知道查看系统环境变量可以用env命令而有一个接口函数getenv“环境变量”可以返回该环境变量的内容。 直接在程序当中获取
我们知道在一个main函数里会有两个默认参数一个是整型argc指的是命令行参数数量另一个是指针数组argv存储的是传递给程序的命令行参数。其实还有第三个参数系统环境变量参数char* env[]
而我们的env指令可以查看当前系统所有环境变量。其实有一个字符指针数组会将我们的环境变量看作字符串依次存放而这个字符指针数组就可看作环境变量表。当系统启动一个程序时会给我们的程序main函数提供两张表1.命令行参数表 2.环境变量表 其实和我们用env指令显示出来的环境变量表是一样的。 bash中的环境变量从何而来 我们知道命令行当中启动的进程都是shell(bash)的子进程而子进程的命令行参数列表其实就是shell传递过来的 ! 但是bash的环境变量信息又是从何而来呢 首先要知道我们每一次登录xshell时都会形成新的bash解释器也是一个进程并且新的bash解释器会自动从一个配置文件中读取信息所以不论我们将bash进程内部的环境变量如何修改最终一旦重启xshell就会恢复。 其实我们每次登录xshell时环境变量信息都会自动导入bash中。可以说环境变量里的信息是以配置文件的形式存在的自然可以查看一下进入家目录中有个隐藏文件.bash_profile可以看作是一个脚本语言 所以说每一次登录xshell时bash进程都会读取.bash_profile配置文件中的内用从而为bash形成环境变量表信息。 如何设置环境变量
首先要知道命令行是支持直接创建变量的但是我们直接设置的变量并不是环境变量而是本地变量。 想要倒入环境变量需要export命令
或者直接export环境变量名xxxx来设置环境变量 但是我们一旦重启xshell的话该环境变量就不见了就是因为我们导入的环境变量是在bash的进程当中仅内存而言并不是添加到配置文件中我们每一次登录xshell时都会形成新的bash解释器也是一个进程并且新的bash解释器会自动从一个配置文件.bash_profile中读取信息所以重启就会消失。如果我们直接在配置文件中更改的话下次重启也就将新建的环境变量加载进来 本地变量和环境变量区别 本地变量只在bash进程内部有效不会被子进程继承下来。 环境变量通过让所有子进程继承的方式实现自身的全局性。 为什么echo可以输出本地变量的值 echo命令并不是常规命令shellbash通过fork()让子进程执行的而是内建命令shell命令行的一个函数所以可以读取shell内部定义的变量 而取消环境变量uset环境变量名 /本地变量
查看所有变量set命令 environ全局指针
其实这是一个全局的二级字符指针指向的正是环境变量表中的内容也就是指向char*[]的类型所以无论哪里我们都可以通过该指针去访问环境变量列表里的内容。 配置文件里的环境变量具有全局属性天然的会被所有进程继承的。