Linux之命令行参数的原理以及实现,环境变量限时增加删除和永久增加删除以及代码获取环境变量

embedded/2024/10/19 4:53:09/

个人主页:点我进入主页

专栏分类:C语言初阶  C语言进阶  数据结构初阶    Linux    C++初阶    算法

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂

一.命令行参数

1.1main函数参数

        在我们学习c语言时我们的main函数的参数是什么样子的?是空吗?事实上不是,main函数有一些参数,这次我们在这里我们先说两个argc和argv,这两个参数有神魔用呢?我们看代码:

#include<stdio.h>int main(int argc,char*argv[])
{for(int i=0;i<argc;i++){printf("argv[%d]->%s\n",i,argv[i]);}return 0;
}

我们编译运行代码,输入指令

./myprocess.exe

可以看到

我们输入

./myprocess.exe -a -b -c

可以看到

1.2为什么这么干

我们回想一下我们在Linux的指令不正是和这个一样吗?例如我们的指令

ls -l -a

 其中ls对应./myprocess.exe ,-l  -a对应-a -b -c等。

有这样的参数我们就可以实现下面的功能:

#include<stdio.h>
#include<string.h>
int main(int argc,char*argv[])
{if(argc!=2){printf("没有选项\n");return 1;}if(strcmp(argv[1],"-a")==0){printf("this is function 1\n");}else if(strcmp(argv[1],"-b")==0){printf("this is function 2\n");}else if(strcmp(argv[1],"-c")==0){printf("this is function 3\n");}else {printf("no this  function \n");}return 0;
}

其中-a是功能1,-b是功能2....

二.环境变量

 2.1环境变量的引入

        我们是否有这样一个疑问?我们知道Linux中一切皆文件,我们的ls指令相当于一个可执行文件,它在任意的地方就可以提使用,我们编写程序生成的可执行程序却需要指定路径然后执行,这就是是否在环境变量中的区别,在Linux中每一次开机都会将环境变量加载到内存中我们可以输入echo &PATH来看当前的环境变量

echo $PATH

2.2.1环境变量的增添(内存级别)

 如果我们想要添加环境变量需要输入指令例如我们想要将/home/yang/Code中的myprocess.exe增加到环境变量中我们输入指令

PATH=/home/yang/Code

当我再次打印环境变量就可以看到

由于此时的环境变量是内存级的所以我们重新打开我们的xshell就可以恢复以前的及环境变量,我们想要将myprocess.exe加入到环境变量中且不覆盖原来的可以输入指令

sudo cp myprocess.exe /usr/bin

这样我们就可以在任意路径下进行使用这个可执行程序

2.2.2环境变量的删除(内存级别)

我们输入指令

sudo rm -rf /usr/bin/myprocess.exe

我们想要使用myprocess.exe就不可以了。 

2.2.3指令增加和删除环境变量(export和unset)

我们可以使用

export hello=111

来增添环境变量 ,这个环境变量是我们自己创建的,我们可以通过指令

env | grep hello

来查看环境变量 

我们想要删除需要输入指令

unset hello

 

2.2.4创建本地变量

我们输入指令

mmm=1

此时mmm就是我们的本地变量,我们想要吧它加入到环境变量中可以输入指令

export mmm

 

2.2 环境变量的修改(可永久保存)

我们先进入家目录,可以输入指令

cd ~

用vim打开./profile文件,在最后一行加上

export PATH=$PATH:/home/yang/Code

 退出保存,然后重新打开我们的xshell,输入指令

echo $PATH

 我们可以看到有我们的环境变量,此时就可以长久保存,想要恢复删除即可。

2.3环境变量的代码获取

2.3.1extern获取环境变量

#include<stdio.h>
#include<unistd.h>
int main()
{extern char**environ;for(int i=0;environ[i];i++){printf("environ[i]->%s\n",environ[i]);}
}

我们运行代码可以看到

这个不正是我们使用env所产生的环境变量吗?

所以环境变量也可以利用代码来获取。

2.3.2main函数获取环境变量

环境变量可以被子进程获取,和我们上面的命令行参数一样,都可以通过父进程给到子进程,main函数的父进程是bash,我们看下面代码

#include<stdio.h>
#include<unistd.h>
int main(int argc,char *argv[],char *env[])
{for(int i=0;env[i];i++){printf("env[i]->%s\n",env[i]);}
}

 bash运行时会自动生成两张表 一张是命令行参数表,一张是环境变量表

这两张表会通过各种方式给子进程(这里指main函数) 

2.3.3getevn获取环境变量        

        我们还可以通过函数getenv来获取单个环境变量,getenv头文件时stdlib.h,当没有找到是返回空,我们看代码

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{char *path=getenv("HOME");if(path==NULL) return 1;printf("%s\n",path);
}

运行结果为:

 我们可以看到在环境变量中HOME对应的就是/home/yang


http://www.ppmy.cn/embedded/3902.html

相关文章

ShardingSphere:强大的分布式数据库中间件【图文】

ShardingSphere的诞生 ShardingSphere的结构 Sharding-JDBC :它提供了一个轻量级的 Java 框架&#xff0c;在 Java 的 JDBC 层提供额外的服务。使用客户端直连数据库&#xff0c;以 jar 包形式提供服务&#xff0c;无需额外部署和依赖&#xff0c;可理解为增强版的 JDBC 驱动&…

在STM32中给固定的地址写入一个值,并通过memory窗口进行查看

首先对STM32中存储数据的地方有一个了解 一个是FLASH,一个是RAM RAM是易失存储器&#xff0c;FLASH是非易失存储器&#xff0c;这是最直观的解释。 主要记住以下几点&#xff1a; RAM&#xff08;随机存储器&#xff09;&#xff1a;既可以从中读取数据&#xff0c;也可以写…

Java中的封装性与几种权限修饰符

Java中的封装性与几种权限修饰符 在Java编程中&#xff0c;封装性是一个核心概念&#xff0c;它涉及到将数据&#xff08;变量&#xff09;和对这些数据进行的操作&#xff08;方法&#xff09;绑定在一起&#xff0c;形成一个独立的单元。封装有助于隐藏对象的内部状态和实现…

sprinboot+vue集成neo4j图数据库

一 、java后台 1.1 package com.admin.domain;/*** 功能描述&#xff1a;** author wangwei* date 2024-01-15 22:13*/ public class ConnectWeb {private String connectWebId;private String connectWebName;private String connectWebInfo;private String personWebIdAlph…

【网络编程】如何创建一个自己的并发服务器?

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的网络编程系列之如何创建一个自己的并发服务器&#xff0c;在这篇文章中&#xff0c;你将会学习到在Linux内核中如何创建一个自己的并发服务器&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图来帮助大家…

每日三个JAVA经典面试题(四十二)

1.Java中的线程池如何帮助优化性能&#xff1f; Java中的线程池是一种重要的并发编程工具&#xff0c;它可以帮助优化性能的方式有以下几点&#xff1a; 资源管理&#xff1a;线程池可以管理并重用线程&#xff0c;而不是为每个任务都创建一个新的线程。这减少了线程创建和销毁…

Vue.js------Vue组件基础

能够理解Vue组件概念和作用能够掌握封装创建组件能力能够使用组件之间通信能够完成todo案例 一.Vue组件创建和使用 1.折叠面板-实现多个 创建一个文件夹demo 具体步骤请参考vue.js---vue基础 ⚫ 解决方案: 采用vue提供的单.vue文件-组件方式来封装一套然后复用 在component…

weblogic JSP action的配置

action(如xxx.do&#xff09;可以在Java文件中通过注解的方式配置&#xff0c;也可以在web.xml中进行配置 在java文件中配置的场合 WebServlet(xxxx.do) 并实现支持的方法&#xff1a;doGet或doPost等 或者 WebServlet(xxxx.do) 并实现service方法 所有method的处理方法都会…