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

news2024/11/18 0:41:47

 命令行参数

什么是命令行参数

命令行参数是指在执行命令行程序时,给程序传递的额外参数。在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.coloradmin.cn/o/1113143.html

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

相关文章

svg常用属性及动画效果

文章目录 引言一、什么是svg二、svg有哪些应用场景三、基本使用四、svg常用属性介绍1. viewBox2. preserveAspectRatio3. symbol标签4.transform1. translate2.scale3.rotate4.skewX和skewY 5. matrix6.stroke-dasharray 五、svg动画1. svg属性结合css动画2. animate 标签动画3…

【网络】网络编程套接字(一)

网络编程套接字 一 一、网络编程中的一些基础知识1、认识端口号2、认识TCP协议和UDP协议3、网络字节序 二、socket编程1、sockaddr结构2、简单的UDP网络程序Ⅰ、服务器的创建Ⅱ、运行服务器Ⅲ、关于客户端的绑定问题Ⅳ、启动客户端Ⅴ、本地测试Ⅵ、网络测试 一、网络编程中的一…

20款VS Code实用插件推荐

前言&#xff1a; VS Code是一个轻量级但功能强大的源代码编辑器&#xff0c;轻量级指的是下载下来的VS Code其实就是一个简单的编辑器&#xff0c;强大指的是支持多种语言的环境插件拓展&#xff0c;也正是因为这种支持插件式安装环境开发让VS Code成为了开发语言工具中的霸主…

升级常有,错误不可避免!更新升级时遇到的错误0x800F081F–0x20003如何修复

Windows更新错误0x800F081F–0x20003主要发生在升级Windows 11/10副本时。这是由于在计算机上启用各种与开发人员相关的设置时出现错误造成的。安装程序遇到的错误被表述为以下任一错误: 我们无法安装Windows 11/10。SAFE_OS阶段的安装失败,INSTALL_UPDATES操作期间出现错误:…

解除OU屏蔽(EBS检查无法直接查询解决)

解除OU屏蔽(EBS检查无法直接查询解决) 具有OU屏蔽的例子 SELECT t.org_id, t.* FROM po.po_headers_all t -- 无屏蔽表&#xff0c;在PL/SQL运行有数据 SELECT t.org_id, t.* FROM apps.po_headers t -- 包含OU屏蔽&#xff0c;在PL/SQL中查询无数据多组织屏蔽原理 1. 在…

免费SSL证书与付费SSL证书的区别

SSL&#xff08;安全套接层&#xff09;证书是网站安全性的关键组成部分&#xff0c;用于保护数据的机密性和完整性。当您考虑在您的网站上部署SSL证书时&#xff0c;您将面临一个重要的决策&#xff1a;是选择免费SSL证书还是付费SSL证书&#xff1f;本文将帮助您理解这两者之…

工具篇之Axure RP 10的使用

引言 最近在学习原型图&#xff0c;针对画原型图的工具&#xff0c;反复对比墨刀、Axure、xiaopiu后&#xff0c;最终选择Axure。 接下来&#xff0c;我便从Axure RP 10的下载、安装、中文字体、授权等几个方面&#xff0c;来介绍Axure。 一、背景 Axure是一款强大的原型设计…

【XSS_MSN】基于GCN的web攻击Payload识别与可解释性分析

原文标题&#xff1a;Web Attack Payload Identification and Interpretability Analysis Based on Graph Convolutional Network 原文链接&#xff1a;https://ieeexplore.ieee.org/document/10076547/ 作者单位&#xff1a;四川大学网络安全学院 相似原理论文&#xff1…

Excel拆分单元格怎么操作?学会这4招,工作效率倍涨!

“刚刚在做一份Excel的报表&#xff0c;需要将某些单元格进行拆分&#xff0c;但是我不知道应该如何处理&#xff0c;大家在使用Excel时有什么比较简单的单元格拆分方法吗&#xff1f;” 当我们需要使用Excel处理大量数据或者创建专业报表时&#xff0c;可能需要对单元格进行拆…

【试题011】C语言多个运算符计算例题

1.题目&#xff1a;表达式1!23/45%6(78)9的值是&#xff1f; 2.代码&#xff1a; #include <stdio.h> int main() {//表达式1 !2 3 / 4 5 % 6 (7 8) 9的值printf("%d\n", (1 !2 3 / 4 5 % 6 (7 8) 9));//分析&#xff1a;多个运算符先考虑优先级…

如何用R语言优雅地玩转PubMed-RISmed包的使用

PubMed是最大的生命科学文献数据库之一&#xff0c;在开展课题使用关键词搜索时&#xff0c;会检索出大量文献。如何对这些文献进行筛选&#xff0c;出了巧妙使用关键词组合外&#xff0c;还可以使用R将相关文献信息一键提取&#xff0c;实现文献的快速浏览。RISmed是一个用于从…

淘宝卖家如何批量采集竞品sku进行分析?推荐2个商品sku获取API

item_sku-获取sku详细信息 请求参数 请求参数&#xff1a;num_iid572050066584&sku_id3880971359554&is_promotion0 参数说明&#xff1a;sku_id:SKU ID num_iid:商品ID is_promotion:是否获取取促销价 API测试页 获取key&secret 响应参数 Version: Date: 名…

实现自动推送:工具助力公众号运营

公众号的运营离不开定期推送内容给用户&#xff0c;但手动推送过程繁琐且耗时。现在&#xff0c;借助乔拓云公众号助手工具&#xff0c;你可以轻松实现自动推送消息的功能。下面&#xff0c;我们一步一步教你如何操作。 首先&#xff0c;我们需要注册并登录乔拓云公众号助手工具…

MATLAB中 tf2zp函数用法

目录 语法 说明 示例 连续时间系统的零点、极点和增益 tf2zp函数的功能是将传递函数滤波器参数转换为零极点增益形式。 语法 [z,p,k] tf2zp(b,a) 说明 [z, p, k] tf2zp(b, a) 从传递函数参数 b 和 a 中找到零点矩阵 z&#xff0c;极点向量 p&#xff0c;以及相关的增益…

uniapp开发多端应用项目时的常见跨端兼容处理

一、跨端兼容 每个端有每个端的特点&#xff0c;有的能被抹平&#xff0c;有的不可能被抹平。 跨端&#xff0c;不是把web的习惯迁移到全平台。而是按照uni的写法&#xff0c;然后全平台使用。 按照uniapp规范开发可以保证多平台兼容&#xff0c;但每个平台有自己的一些特性。…

实用的数据集成方式

随着企业数字化转型的加速推进&#xff0c;数据集成变得愈发重要&#xff0c;它是实现信息流动和系统协同的关键步骤。 数据集成是企业数字化转型的重要一环。利用实用的数据集成方式&#xff0c;企业能够高效地实现信息流动和系统协同&#xff0c;提升企业运营效率和决策能力…

重庆东微电子推出高性能抗射频干扰MEMS硅麦放大器芯片

专业的模拟及混合信号芯片设计企业重庆东微电子股份有限公司日前宣布&#xff1a;成功开发并推出其第三代硅基微机电系统麦克风&#xff08;Silicon MEMS Microphone&#xff0c;以下简称“MEMS麦克风”&#xff09;模拟接口放大器芯片EMT6913。该芯片针对低功耗MEMS麦克风应用…

中科芯与IAR共建生态合作,IAR集成开发环境全面支持CKS32系列MCU

中国上海–2023年10月18日–嵌入式开发软件和服务的全球领导者IAR今日宣布&#xff0c;与中科芯集成电路有限公司&#xff08;以下简称中科芯&#xff09;达成生态合作&#xff0c;IAR已全面支持CKS32系列MCU的应用开发。这一合作将进一步推动嵌入式系统的发展&#xff0c;并为…

asp.net乒乓球场地管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net乒乓球场地管理系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 asp.net 乒乓球场地管理系统 二…