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.rhkb.cn/news/165203.html

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

相关文章

Java:ApacheHttpClient连接寿命(timeToLive)未配置问题分析

一、问题描述 若 Apache HttpClient 未设置 timeToLive&#xff0c;通过服务域名访问服务的实例并且服务域名解析出的 IP 发生变化时&#xff0c;在短时间内会有部分请求出现连接异常错误。 二、问题分析 Apache HttpClient 通过服务域名从连接池获取连接&#xff0c;当连接…

[C语言]排序的大乱炖——喵喵的成长记

宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重要…

睿趣科技:抖音小店新手运营攻略

随着短视频平台的兴起&#xff0c;抖音已经成为了一个炙手可热的营销工具。越来越多的商家选择在抖音上开设小店&#xff0c;以此来拓展自己的业务。那么&#xff0c;作为新手&#xff0c;如何运营好自己的抖音小店呢?本文将为您提供一些实用的建议。 首先&#xff0c;要明确自…

如何创建高效的 Python Docker 镜像详解

Docker是打包和部署容器中应用程序的行业标准软件。Docker镜像是构建和运行应用程序的基础&#xff0c;为了充分发挥Docker的潜力&#xff0c;您需要优化镜像以提高资源效率、安全性和性能。这将确保您的应用程序在Docker生态系统内无缝运行。 通过一个实际示例来学习如何实现…

Oracle监听服务启动后停止

问题 解决办法 找到listener.ora文件,箭头指的地方&#xff0c;host改为localhost 如何找到listener.ora 其中1522端口&#xff0c;是我新增的监听服务。之前这个host是一个固定的ip地址&#xff0c;我更换网络环境后&#xff0c;ip地址变了&#xff0c;所以导致监听启动失败。…

ChatGPT(1):ChatGPT初识

1 ChatGPT原理 ChatGPT 是基于 GPT-3.5 架构的一个大型语言模型&#xff0c;它的工作原理涵盖了深度学习和自然语言处理技术。以下是 ChatGPT 的工作原理的一些关键要点&#xff1a; 神经网络架构&#xff1a;ChatGPT 的核心是一个深度神经网络&#xff0c;采用了变种的 Tran…

vue-pdf多页预览异常,Rendering cancelled, page 1 Error at BaseExceptionClosure xxx

项目开发使用vue-pdf,单页情况预览正常&#xff0c;多页vue-pdf预览异常&#xff0c;第一次预览时&#xff0c;会先弹出异常模态窗口&#xff0c;关闭模态窗口&#xff0c;pdf又是正常显示&#xff0c;报错信息及异常截图如下&#xff1a; 报错信息 Rendering cancelled, page…

Nginx集群负载均衡配置完整流程

今天&#xff0c;良哥带你来做一个nginx集群的负载均衡配置的完整流程。 一、准备工作 本次搭建的操作系统环境是win11&#xff0c;linux可配置类同。 1&#xff09;首先&#xff0c;下载nginx。 下载地址为&#xff1a;http://nginx.org/en/download.html 良哥下载的是&am…

vulkan SDK安装

文章目录 一. vulcan官网二.安装流程 一. vulcan官网 https://vulkan.lunarg.com/sdk/home#windows 二.安装流程 点击下载 双击下载的*.exe进行安装 点击下一步 点击下一步 选择安装位置&#xff0c;点击下一步 点击全选&#xff0c;选择下一步 勾选同意&#xf…

2023年中国多功能折叠刀产量、销量及市场规模分析[图]

多功能折叠刀是一种集多种功能于一身的刀具&#xff0c;通常包括切割、开瓶、剥皮、锯木等功能&#xff0c;可以通过折叠和展开的方式来实现不同的功能&#xff0c;具有便携、多用途、安全等特点&#xff0c;广泛应用于户外探险、露营、自驾旅行等场景。 多功能折叠刀行业分类…

grafana v10.1版本设置告警

1. 相关概念概述 如图所示&#xff0c;点击切换菜单标志&#xff0c;可以看到警报相关子选项。 警报规则&#xff1a;通过PromQL语句定义告警规则&#xff0c;即达到怎样的状态触发告警。 联络点&#xff1a; 设置当警报规则实例触发时&#xff0c;如何通知联系人&#xff0c;…

使用Perl和WWW::Mechanize库编写

以下是一个使用Perl和WWW::Mechanize库编写的网络爬虫程序的内容。代码必须使用以下代码&#xff1a;jshk.com.cn/get_proxy 首先&#xff0c;确保已经安装了Perl和WWW::Mechanize库。如果没有&#xff0c;请使用以下命令安装&#xff1a; cpan WWW::Mechanize创建一个新的Pe…

代码随想录二刷 Day 44

01背包问题二维做法先遍历背包或者物品都可以&#xff0c;然后是前序遍历&#xff1b; 一维做法一定先遍历物品然后遍历背包&#xff0c;遍历背包的时候是后序遍历&#xff1b;一维做法还是有点难理解&#xff0c;其实就是后面的数字还是要从前面的推导出来&#xff0c;但是如…

安装Apache2.4

二、安装配置Apache&#xff1a; 中文官网&#xff1a;Apache 中文网 官网 (p2hp.com) 我下的是图中那个版本&#xff0c;最新的64位 下载下后解压缩。如解压到D:\tool\Apache24 PS&#xff1a;特别要注意使用的场景和64位还是32位版本 2、修改Apcahe配置文件 2.1配置Apache…

【音视频流媒体】 3、ffmpeg、ffplay、ffprobe 超详细介绍

文章目录 一、ffmpeg1.1 安装1.2 基本参数 二、ffprobe2.1 查编码格式2.2 查视频时长 五、视频转流5.1 MP4转H2645.2 H264转MP45.3 AVI转MP45.4 MP4转H265 六、视频文件6.1 播放6.2 filter 过滤器6.2.1 crop 6.3 视频截取6.4 视频拼接6.5 获取分辨率 七、视频和图7.1 视频抽帧7…

传输层协议(TCP/UDP协议)

全文目录 端口号端口号范围划分 传输层UDP协议特点基于UDP的应用层协议 TCP协议确认应答机制&#xff08;可靠性&#xff09;延迟应答机制超时重传机制流量控制连接管理机制TIME_WAIT 状态CLOSE_WAIT 状态拥塞控制滑动窗口 TCP、UDP对比TCP的listen第二个参数 端口号 在套接字…

jmeter接口测试避坑指南

接口测试看着很简单&#xff0c;但是操作过程中还是出现很多问题&#xff0c;现总结如下&#xff1a; 一、jmeter中乱码问题 可在jmeter.properties 这个文件里面找到sampleresult.default.encodingxx&#xff0c;后面xx改成utf-8&#xff0c;然后取消注释。 解决jmeter的bod…

【RocketMQ系列五】消息示例-顺序消息延迟消息广播消息的实现

1. 前言 上一篇文章我们介绍了简单消息的实现&#xff0c;本文将主要来介绍顺序消息的实现&#xff0c;顺序消息分为局部顺序消息和全局顺序消息。 顺序消息指的是消费者在消费消息时&#xff0c;按照生产者发送消息的顺序进行消费。即先发送的先消费【FIFO】。 顺序消息分为…

vue2升级到vue2.7

vue2升级到vue2.7 小小的改进,大大的提升 只需要简单修改,开发体验得到大大提升. 为什么要升级Vue2.7 不能拒绝的理由: 组合式 API(解决mixins问题:命名冲突,隐式依赖)单文件组件内的 <script setup>语法模板表达式中支持 ESNext 语法(可选链:?.、空值合并:??)单文…