Linux命令函参数&环境变量

命令行参数

在C语言中,main 函数可以接受命令行参数,其原型通常为:

c 复制代码
int main(int argc, char *argv[])
  • argc:命令行参数个数
  • argv:一个指针数组,指向字符串数组的指针,每个字符串表示一个命令行参数
  • argv数组最后以NULL结束

在c程序中使用命令行参数

c 复制代码
#include <stdio.h>
int main(int argc,char* argv[])
{
    printf("Number of command-line arguments: %d\n", argc);
    
    for(int  i = 0; argv[i] ; i++)
    {
        printf("argv[%d]:%s\n",i,argv[i]);
    }
    return 0;
}

编译完成后执行可以带参数执行

使用命令行参数在编译执行时执行不同的代码,比如实现一个简单的计算器

c 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char* argv[])
{

    //命令行参数必须够4个,第一个可执行程序,第二个运算符,后面两个是操作数
    //输错打印提示信息
   if(argc != 4)
   {
        printf("tip:\n\t%s -[add|sub|mul|div] x y\n\n", argv[0]);
        return 1;
   }
   int leftoperand = atoi(argv[2]);//左操作数
   int rightoperand = atoi(argv[3]);//右操作数
   //add +
   if(strcmp("-add",argv[1]) == 0)
   {
    printf("%d + %d = %d\n",leftoperand,rightoperand,leftoperand + rightoperand);
   }
   //sub -
   else if(strcmp("-sub",argv[1]) == 0)
   {
    printf("%d - %d = %d\n",leftoperand,rightoperand,leftoperand - rightoperand);
   }
   //mul * 
   else if (strcmp("-mul",argv[1]) == 0)
   {
    printf("%d * %d = %d\n",leftoperand,rightoperand,leftoperand * rightoperand);
   }
   //div /
   else if( strcmp("-div",argv[1]) == 0)
   {
     printf("%d / %d = %d\n",leftoperand,rightoperand,leftoperand / rightoperand);
   }
   else 
   {
    printf ("unkown\n");
   }
    return 0;
}

运行结果

环境变量

  • 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数
  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

main函数参数

main函数参数不止上面两个,还有一个

c 复制代码
int main(int argc, char *argv[], char *envp[])

envp :也是一个指针数组,其中每个元素是一个字符串,表示一个环境变量。每个环境变量的格式为"key=value"。数组以空指针 NULL 结尾,表示环境变量列表的结束。

举例envp访问环境变量

c 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char* argv[],char* envp[])
{
    //envp访问环境变量
    for (int i = 0; envp[i]; i++)
    {
        printf("envp[%d] = %s\n",i,envp[i]);
    }
    return 0;
}

运行结果

常见的环境变量

  • PATH:指定命令的搜索路径
  • HOME:指定用户的主工作目录
  • SHELL:指定用户默认的命令行解释器。它的值通常是/bin/bash。
  • USER:存储当前登录用户的用户名。

查看环境变量

echo $NAME

比如echo &USER查看当前用户名

测试环境变量

PATH

当我们执行系统中的命令时,比如ls ,不论在什么路径下直接输入ls即可执行,当我们执行自己的程序,到可执行程序的路径下,在输入./程序名,才可以执行自己的程序。

要执行一个可执行程序必须要先找到它在哪里,ls命令系统能够通过名称找到ls的可执行程序的位置,而系统是无法找到我们自己的可执行程序的,所以我们必须带上./,以此告诉系统该可执行程序位于当前目录下。

系统就是通过环境变量PATH命令找到ls命令的位置的,

可以看到环境变量PATH当中有多条路径,这些路径由冒号隔开,当你使用ls命令时,系统就会查看环境变量PATH,然后默认从左到右依次在各个路径当中进行查找。
而ls命令实际就位于PATH当中的某一个路径下,所以就算ls命令不带路径执行,系统也是能够找到的。

当我们把自己的可执行程序路径添加到PATH环境变量中,或者把自己的可执行程序拷贝到PATH中的任意一个路径下,也就可以在任意位置直接执行。

  1. 把自己的可执行程序路径添加到PATH环境变量中 使用export导入环境变量
    export PATH=$PATH:自己可执行程序的路径
  1. 把自己的可执行程序拷贝到PATH中的任意一个路径下 一般不建议这么做,污染系统文件。

环境变量相关的命令

  • echo:查看指定环境变量的值
  • export:设置一个新的环境变量 export VARIABLE_NAME=value
  • env:显示所有的环境变量
  • unset: 清除环境变量
  • set: 显示本地定义的shell变量和环境变量

环境变量的组织方式

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以'\0'结尾的环境字符串。

获取环境变量

除了上面的mian函数参数envp可以拿到环境变量,还可以通过第三方变量environ获取

c 复制代码
int main(int argc,char* argv[])
{

    extern char** environ;
    for(int i =0 ;environ[i];++i)
    {
        printf("%s\n",environ[i]);
    }
    return 0;
}

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明

通过库函数获取环境变量

  • getenv()函数:是一个C语言标准库函数,用于获取指定环境变量的值。它可以在程序运行时访问当前进程的环境变量,并返回相应变量的值。

函数原型:

arduino 复制代码
char* getenv (const char* name);

示例:

c 复制代码
int main(int argc,char* argv[])
{

    //getenv获取环境变量
    char* username = getenv("USER");
    //如果当前用户是ding则打印Hello否则输入没有权限执行
    if(strcmp("ding",username) == 0)
    {
        printf("Hello %s\n",username);
    }
    else{
        printf("You don't have access.\n");
    }
    return 0;
}

环境变量通常具有全局属性

环境变量通常具有全局属性,可以被子进程继承下去

c 复制代码
#include #include
int main()
{ 
    char * env = getenv("MYENV");
    if(env)
    { 
        printf("%s\n", env);
    }
    return 0; 
}

直接查看,发现没有结果,说明该环境变量根本不存在

导出环境变量 export MYENV="hello world" 再次运行程序,发现结果有了!说明:环境变量是可以被子进程继承下去

相关推荐
pk_xz1234561 小时前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强2 小时前
Linux之sed命令详解
linux·运维·服务器
Lary_Rock4 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
云飞云共享云桌面5 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
Peter_chq6 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
一坨阿亮7 小时前
Linux 使用中的问题
linux·运维
dsywws8 小时前
Linux学习笔记之vim入门
linux·笔记·学习
幺零九零零9 小时前
【C++】socket套接字编程
linux·服务器·网络·c++
小林熬夜学编程10 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
程思扬11 小时前
为什么Uptime+Kuma本地部署与远程使用是网站监控新选择?
linux·服务器·网络·经验分享·后端·网络协议·1024程序员节