Linux下的命令行参数和环境变量

 命令行参数

什么是命令行参数

命令行参数是指在执行命令行程序时,给程序传递的额外参数。在Linux终端中,命令行参数通常通过在命令后面添加空格分隔的参数来传递。

Linux下以main函数举例说明

    #include<stdio.h>int main(int argc char* argv[])//命令行参数{int i=0;for(i=0;i<argc;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 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4 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",left+right);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")==0&&right!=0)20         printf("div=%d\n",left/right);                                                               21  22     return 0;23 }

如果把这可执行程序 ./a.out换成calculate不就更加醒目了嘛。 

其实我们linux下的大部分指令都是通过通过对可执行程序的命令行参数进行if-else从而实现的。就像ls-l以及ls-al...就是典型的可执行程序形成的命令行指令,而后面的选项就是命令行参数,被shell打散成子串被程序接收。从而达到同一个程序可以实现不同的功能的作用

命令行参数类型

  1. 选项参数(Options):以"-"或"--"开头,用来标识命令的不同选项或功能。 例如:ls -l -a表示使用长格式显示所有文件和目录,包括隐藏文件。
  2. 参数值参数(Arguments):不带"-"或"--"的额外参数,用于给命令提供一些特定的值或数据。 例如:cp file1.txt file2.txt表示将file1.txt复制为file2.txt。 

环境变量

环境变量是在操作系统中定义的一些变量,用来保存一些系统或用户的配置信息。它们是一种在系统运行时可以动态改变的值,可以在不同的应用程序之间进行共享和传递。

命令行的类型 

  1. 可执行程序:这些是真正的可执行程序,它们是由编译过的源代码生成的二进制文件。例如,ls、cp、mv等命令都是可执行程序

  2. 内置命令:这些是由shell(如bash)内置的命令,它们直接嵌入在shell解释器中,而不是作为独立的可执行文件存在。例如,cd、echo、pwd等命令都是内置命令

  3. 别名(alias):这些是用户定义的命令别名,可以简化常用命令的使用。用户可以用alias命令定义自己的别名,以更方便地执行命令。例如,用户可能定义alias ll="ls -l"来替代原始的ls命令。

 我们知道有的命令行是可执行程序,有的命令行是内置命令,另外一种就是命令取别名。而上面我们自己实现的calculate可执行程序也可以看做命令。但是我们执行时要带./ 是因为:执行一个命令需要找到对应程序的路径。所以在当前目录下我们写的程序都要带上./才能执行


但是为什么我们linux下的可执行程序命令不用带路径也可以执行呢??

其实linux下的指令是有默认搜索路径的,也就是当你使用该指令时,linux会自动在默认路径里面去找而该默认路径是什么呢???其实这就与环境变量PATH有关。


PATH 

在linux系统中存在环境变量,可以记录系统中可执行程序的搜索路径,该环境变量也就是PATH:用于指定可执行程序的搜索路径,当输入一个不带路径的命令时,系统会默认在PATH的内容中按照顺序在路径列表中查找可执行程序的所在路径。

查看

我们可以通过echo $变量名的方式来查看该环境变量的值


解释作用 

所以解释一下linux的ls指令,当我们执行命令时,默认就在PATH环境变量里以冒号作为分隔符依次在以下路径中查找ls命令,找到了该可执行程序也就可以运行了。所以说我们自己的可执行程序要带上路径才能执行就是因为我们的程序不在PATH环境变量下的路径当中。 

所以说如果我们想要自己的程序也可以不带路径直接运行的话,就应该将我们程序所在路径放到环境变量PATH中。可以增加路径可以将可执行程序拷贝到PATH里任意原有路径。

更改PATH内容 

PATH=$PATH:+可执行程序所在路径//将我们的程序拼接到PATH环境变量下的路径中
//$PATH就是原来环境变量下的内容
//:就是分隔符(连续两个路径是靠:作为分隔符)
所以PATH=xxxx(xxx是什么,环境变量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命令并不是常规命令(shell(bash)通过fork()让子进程执行的)而是内建命令(shell命令行的一个函数)所以可以读取shell内部定义的变量


而取消环境变量:uset+环境变量名 /本地变量

查看所有变量:set命令


environ全局指针

其实这是一个全局的二级字符指针,指向的正是环境变量表中的内容(也就是指向char*[]的类型)所以无论哪里我们都可以通过该指针去访问环境变量列表里的内容。

 


配置文件里的环境变量具有全局属性,天然的会被所有进程继承的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++入门(3):引用,内联函数

一、引用 1.1 引用特性 引用必须初始化 一个变量可以有多个引用 引用一旦引用一个实体&#xff0c;就不能引用其他实体 int main() {int a 10, C 20;int& b a;b c; // 赋值&#xff1f;还是b变成c的别名&#xff1f;return 0; }1.2 常引用 引用权限可以平移或缩小…

MySQL实践——分页查询优化

问题现象 一个客户业务系统带有分页查询功能&#xff0c;但是随着查询页数的增加&#xff0c;越往后查询性能越差&#xff0c;有时一个查询可能需要1分钟左右的时间。分页查询的写法类似于&#xff1a; select * from employees limit 250000,5000;这是最传统的一种分页查询写…

AD9371 官方例程HDL详解之JESD204B TX侧时钟生成 (三)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

GB28181学习(十一)——控制(PTZ、镜头、光圈等控制)

要求 源设备向目标设备发送控制命令&#xff0c;控制命令类型包括&#xff1a; 摄像机云台控制远程启动录像控制报警布防/撤防报警复位强制关键帧拉框放大/缩小看守位控制PTZ精准控制存储卡格式化目标跟踪软件升级设备配置 设备配置的内容包括&#xff1a; 基本参数视频参数范…

React TypeScript安装npm第三方包时,些包并不是 TypeScript 编写的

npm install types/包名称 例如&#xff1a;npm install types/jquery 学习链接

QSPI介绍

0 Preface/Foreword 1 QSPI介绍

Win10下基于VS2015编译SQLite3源码

一、下载SQLite SQLite SQLite Download Page 下载红框部分的3个文件 提示&#xff1a;这里有个 sglite-autoconf-3420000.tar.gz 是免编译版&#xff0c;想省事就下载这个&#xff0c;但我自己用这个老是编译不过 所以我这里不推荐这个了 二、配置SQLite 打开vs 2015或者其他…

Android Kotlin 协程初探 | 京东物流技术团队

1 它是什么&#xff08;协程 和 Kotlin协程&#xff09; 1.1 协程是什么 维基百科&#xff1a;协程&#xff0c;英文Coroutine [kəru’tin] &#xff08;可入厅&#xff09;&#xff0c;是计算机程序的一类组件&#xff0c;推广了协作式多任务的子程序&#xff0c;允许执行被…

SqueezeNet 一维,二维网络复现 pytorch 小白易懂版

SqueezeNet 时隔一年我又开始复现神经网络的经典模型&#xff0c;这次主要复的是轻量级网络全家桶&#xff0c;轻量级神经网络旨在使用更小的参数量&#xff0c;无限的接近大模型的准确率&#xff0c;降低处理时间和运算量&#xff0c;这次要复现的是轻量级网络的非常经典的一…

muduo源码学习base——Atomic(原子操作与原子整数)

Atomic(原子操作与原子整数&#xff09; 前置知识AtomicIntegerTget()getAndAdd()getAndSet() 关于原子操作实现无锁队列(lock-free-queue) 前置知识 happens-before&#xff1a; 用来描述两个操作的内存可见性 如果操作 X happens-before 操作 Y&#xff0c;那么 X 的结果对于…

有奖招募——2023年度清华社“荐书官”活动今日开始了!

又到“1024程序员节”了&#xff0c;维护网络世界稳定和平的程序员大大们&#xff0c;辛苦了&#xff01;生活难免有bug&#xff0c;来给彼此个hug~ 过完1024&#xff0c;这一年也快要结束了&#xff0c;岁末回顾又要提上日程。很多人都有整理年度书单的习惯&#xff0c;那么这…

架构风格区别-架构案例(五十九)

管道-过滤器和仓库的区别&#xff1f; 独立的数据仓库&#xff0c;处理流独立&#xff0c;处理数据用连接仓库工具数据与处理在一起&#xff0c;改动的话需要重启系统需要仓库工具与仓库连接&#xff0c;数据与处理分离&#xff0c;性能差可以支持并发连接访问仓库&#xff0c…

【经验分享】如何构建openGauss开发编译提交一体化环境

前文 本文适合对openGauss源代码有好奇心的爱好者&#xff0c;那么一个友好的openGauss源代码环境应该是怎么样的。openGauss的开发环境是如何设置的&#xff1f;openGauss的编译环境是如何构建的&#xff1f;如何向openGauss提交代码&#xff0c;笔者集合官方和几位博主实践提…

2023年【危险化学品生产单位主要负责人】考试报名及危险化学品生产单位主要负责人模拟考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品生产单位主要负责人考试报名考前必练&#xff01;安全生产模拟考试一点通每个月更新危险化学品生产单位主要负责人模拟考试题题目及答案&#xff01;多做几遍&#xff0c;其实通过危险化学品生产单位主要负…

用nodejs爬虫台湾痞客邦相册

情景:是这样的,我想保存一些喜欢的小伙伴的照片,一张张保存太慢了, 所以我写了个js,放在国外服务器爬,国内的自己解决~ 使用方法 1.点相册随便一张, 复制url, 这张开始接下来的图片都会保存 /*** 2023年10月23日 22:58:44* 支持解析痞客邦相册* 只需要复制相册第一张图片的ur…

新款模块上线实现SIP模块与扩拨电话之间打点与喊话功能 IP矿用电话模块SV-2800VP

新款模块上线实现SIP模块与扩拨电话之间打点与喊话功能 IP矿用电话模块SV-2800VP 一、简介 SV-2800VP系列模块是我司设计研发的一款用于井下的矿用IP音频传输模块&#xff0c;可用此模块打造一套低延迟、高效率、高灵活和多扩展的IP矿用广播对讲系统&#xff0c;亦可对传统煤…

Linux 下安装配置部署MySql8.0

一 . 准备工作 MySQL安装包&#xff1a;在官网下载需要的版本&#xff0c;这里我用的版本是 MySQL 8.0.34 https://dev.mysql.com/downloads/mysql/ 本次linux机器使用的是阿里云ECS实例 二 . 开始部署 1. 将安装包上传至服务器 解压到当前文件夹 tar -zxvf mysql-8.0.34…

SAP HANA Time Zone设置

通常对于MINICHECK中检查出来的Timezone时区设置问题&#xff0c;可以通过以下方式进行修改 对于ABAP系统 修改HANA 参数即可 • indexserver.ini -> [global] -> timezone_default_data_client_name 000 • indexserver.ini -> [global] -> timezone_default_da…

蓝桥杯每日一题2023.10.21

后缀表达式 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 30分解法&#xff1a;要求出最大的结果就需要加的数越大&#xff0c;减的数越小&#xff0c;以此为思路简单列举即可 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N 2e5 10…

微信小程序设计之主体文件app-json-pages

一、新建一个项目 首先&#xff0c;下载微信小程序开发工具&#xff0c;具体下载方式可以参考文章《微信小程序开发者工具下载》。 然后&#xff0c;注册小程序账号&#xff0c;具体注册方法&#xff0c;可以参考文章《微信小程序个人账号申请和配置详细教程》。 在得到了测…