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打散成子串被程序接收。从而达到同一个程序可以实现不同的功能的作用。
命令行参数类型
- 选项参数(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 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*[]的类型)所以无论哪里我们都可以通过该指针去访问环境变量列表里的内容。
配置文件里的环境变量具有全局属性,天然的会被所有进程继承的。
相关文章:

Linux下的命令行参数和环境变量
命令行参数 什么是命令行参数 命令行参数是指在执行命令行程序时,给程序传递的额外参数。在Linux终端中,命令行参数通常通过在命令后面添加空格分隔的参数来传递。 Linux下以main函数举例说明 #include<stdio.h>int main(int argc char* argv[])…...

语音芯片KT142C两种音频输出方式PWM和DAC的区别
目录 语音芯片KT142C两种音频输出方式PWM和DAC的区别 一般的语音芯片,输出方式,无外乎两种,即dac输出,或者PWM输出 其中dac的输出,一般应用场景都是外挂功放芯片,实现声音的放大,比如常用的音箱…...
Kotlin 协程的挂起和阻塞的区别
一,简介 Kotlin协程引入了非常强大的异步编程模型,通过挂起而不是阻塞来实现并发操作。以下是有关Kotlin协程挂起和阻塞的详细介绍: 挂起(Suspending): 挂起是指一个协程的执行可以在不阻塞线程的情况下暂…...

解决Github Markdown图片显示残缺的问题
title: 解决Github Markdown图片显示残缺的问题 tags: 个人成长 categories:杂谈 在Github存放Markdown文档,如果图片没有存放在Github服务器上,github会尝试生成Github图片缓存,使用Github图片缓存,进行实际的展示。但比较蛋疼的…...

[MAUI]深入了解.NET MAUI Blazor与Vue的混合开发
文章目录 Vue在混合开发中的特点创建MAUI项目创建Vue应用使用element-ui组件库JavaScript和原生代码的交互传递根组件参数从设备调用Javascript代码从Vue页面调用原生代码 读取设备信息项目地址 .NET MAUI结合Vue的混合开发可以使用更加熟悉的Vue的语法代替Blazor语法ÿ…...

1209. 带分数
题目: 1209. 带分数 - AcWing题库 思路: 1.targetab/c,由题意a,b,c会包含1~9 且每个数出现且只能出现一次。我们可以抽象化为9个坑位分成3份分别给a,b,c。 2.先采用递归搜索树写出9个坑位的全排列,再分成3个区,分…...

【树莓派触摸屏等学习笔记】
前言 树莓派触摸屏 提示:以下是本篇文章正文内容,下面案例可供参考 一、触摸屏硬件驱动 出现黑屏的时候,恢复一下txt config.txt 全屏显示 showFull Exec :自启动 surf 算法 特征点识别 算法的复杂度挺高的 特性树莓派强大…...

ERR_PNPM_JSON_PARSE Unexpected end of JSON input while parsing empty string in
终端报错: ERR_PNPM_JSON_PARSE Unexpected end of JSON input while parsing empty string in 报错原因:依赖没有删除干净 解决办法: ①删除node_modules ②在package.json的dependencies删除不需要依赖 ③重新pnpm i...

linux基础IO
文章目录 前言一、基础IO1、文件预备知识1.1 文件类的系统调用接口1.2 复习c语言接口 2、文件类的系统调用接口2.1 open系统调用2.2 close系统调用2.3 write系统调用2.4 read系统调用 3、文件描述符3.1 文件描述符fd介绍3.2 文件描述符fd分配规则与重定向3.3 重定向原理3.4输入…...

华为OD机试 - TLV格式 - 逻辑分析(Java 2023 B卷 100分)
目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…...
LLMs之RAG:利用langchain实现RAG应用五大思路步骤—基于langchain使用LLMs(ChatGPT)构建一个问题回答文档的应用程序实战代码
LLMs之RAG:利用langchain实现RAG应用五大思路步骤—基于langchain使用LLMs(ChatGPT)构建一个问题回答文档的应用程序实战代码 目录 相关文章...
链式队列----数据结构
队列的基本概念 队列是一种操作受限的线性表(先进先出),只允许在队尾插入,队头删除。 例如去银行办理业务,肯定是先来的先出去,后来的人排在后方,只有第一个人业务办理完了,才会有…...
VM虚拟机VMware Fusion(13.5.0)
VMware Fusion提供了在Apple Mac上运行Windows、Linux等操作系统的最佳方式,无需重新启动。Fusion 13支持运行macOS 12及更高版本的Intel和Apple Silicon Mac,并包含面向开发人员、IT管理员和日常用户的功能。 Fusion 13 新增功能 支持新的客户机操作系…...

自动化测试08
Junit 为什么学了Selenium还需学习Junit Selenium自动化测试框架;Junit单元测试框架。 拿着一个技术写自动化测试用例(Selenium3) 拿着一个技术管理已经编写好的测试用例(Junit5) Junit相关的技术 Junit是针对Java的一…...

d3dx9_43.dll丢失有什么办法可以解决,解决d3dx9_43.dll丢失
通常d3dx9_43.dll丢失都是在运行游戏时汤出的d3dx9_43.dll找不到的错误窗口,因为d3dx9_43.dll文件更多是在使用游戏时会被调用的dll文件,d3dx9_43.dll是属于DirectX9的一个组件,DirectX9是游戏系统中的一个重要程序,所以当d3dx9_4…...

【C++】: auto关键字(C++11)+基于范围的for循环(C++11)+指针空值nullptr(C++11)
auto关键字(C11) 随着程序越来越复杂,程序中用到的类型也越来越复杂,经常体现在: 类型难于拼写含义不明确导致容易出错 #include <string> #include <map> int main() {std::map<std::string, std::…...

华为OD机试 - 玩牌高手 - 动态规划(Java 2023 B卷 100分)
目录 一、题目描述二、输入描述三、输出描述四、解题思路具体规则如下:具体步骤如下: 五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 一、题目描述 给定一个长度为n的整型数组࿰…...

【java】【重构二】分模块开发版本锁定以及耦合(打包)实战
目录 一、创建dependencyManagement标签 二、 将需要版本控制的依赖版本进行标签设置 三、将需要版本控制的依赖从各子模块迁移到此处 四、将父模块的依赖版本控制 五、删除子模块的全部版本 1、bocai-web-management模块 2、bocai-utils模块 六、打包 1、确定代码都…...

Excel提高工作效率常用功能
定位快捷键使用 CtrlG或者F5 根据不同类别插入空行 例:以下表,以部门为单位,每个部门后插入空白行 部门姓名出勤基本工资岗位津贴公体加班绩效基数工龄应发合计财务部姓名73115002101710财务部姓名11116006003401502363财务部姓名5271000…...

物联网_00_物理网介绍
1.物联网为什么会出现? 一句话-----追求更高品质的生活, 随着科技大爆炸, 人类当然会越来越追求衣来伸手饭来张口的懒惰高品质生活, 最早的物联网设备可以追溯到19世纪末的"在线可乐售卖机"和"特洛伊咖啡壶"(懒惰的技术人员为了能够实时看到物品的情况而设…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...