【Linux】:命令行参数

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux命令行参数的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通****

数据结构专栏:数据结构****

个 人 主 页 :stackY、****

C + + 专 栏 :C++****

Linux 专 栏 :Linux****

目录

[1. 命令行参数](#1. 命令行参数)

[1.1 命令行参数是什么](#1.1 命令行参数是什么)

[1.2 实现命令行版的计算器](#1.2 实现命令行版的计算器)

[1.3 自定义实现基本指令](#1.3 自定义实现基本指令)


1. 命令行参数

从我们写代码到现在,我们说mian函数是程序的入口点,那么既然是函数,就要被调用!

  • 在Linux系统中,一个进程(包括mian函数)是通过父进程fork出子进程然后开始执行的;
  • 在C语言程序中,没有其他函数直接调用mian函数;main函数的执行代表了整个程序的开始,而程序的结束则是通过main函数的返回值来表示。
    其实在我们Linux系统中,mian函数也是可以带参数的;
cpp 复制代码
int main(int argc, char * argv[])

那么这两个参数是代表什么意思呢?可以先来看一段代码:

cpp 复制代码
#include <stdio.h>

int main(int argc, char* argv[])
{
    for(int i = 0; i < argc; i++)
    {
        printf("%d: %s\n", i, argv[i]);
    }
    return 0;
}

1.1 命令行参数是什么

通过代码的实验可以看到:

argc就是我们在命令行输入的选项个数(以空格作为分隔符)

argv依次保存的是每一个通过空格分割的选项字串的起始地址,最后一个位置以NULL结尾

那么有没有可能argv\[\]里面没有任何数据呢?

肯定至少都有一个,因为启动程序的指令:./可执行程序 就已经是第一个参数了!

上述工作由shell或者OS自动帮我们完成!

1.2 实现命令行版的计算器

可以通过命令行参数然后编写代码实现一个简易版的计算器:

通过启动可执行程序,然后在后面跟上运算法则,再带上两个数

./可执行程序 -add num1 num2

cpp 复制代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>


// ./可执行程序 -add num1 num2 
int main(int argc, char *argv[])
{
    // 判断输入是否合理
    if (argc != 4)
    {
        // 提示正确的使用
        printf("Use error, Usage: %s op[-add|sub|mul|div] num1 num2\n", argv[0]);
        return 1;
    }

    int x = atoi(argv[2]); // 转化为整数
    int y = atoi(argv[3]);
    int result = 0;

    if (strcmp(argv[1], "-add") == 0)
    {
        result = x + y;
        printf("%d + %d = %d\n", x, y, result);
    }
    else if (strcmp(argv[1], "-sub") == 0)
    {
        result = x - y;
        printf("%d - %d = %d\n", x, y, result);
    }
    else if (strcmp(argv[1], "-mul") == 0)
    {
        result = x * y;
        printf("%d * %d = %d\n", x, y, result);
    }
    else if (strcmp(argv[1], "-div") == 0)
    {
        if (0 == y)
            printf("%d/%d=error! div zero\n", x, y);
        else
            printf("%d/%d=%d\n", x, y, x / y);
    }
    else
    {
        printf("Use error, you should use right command line\nUsage: %s op[-add|sub|mul|div] d1 d2\n", argv[0]);
    }
    return 0;
}


通过使用命令行参数来使用这个计算器,然后再对比我们使用的指令,比如ls、ls -l、

ls -l -a、ls -l -a -n、touch file等等这些指令后面跟的选项就类似于现在实现的计算器,所以就可以得出我们使用指令的时候,第一个就是要运行的可执行程序,后面跟的选项就是一个个命令行参数,然后将这些命令行根据空格分割,传递给这个程序,然后就可以实现制定操作了!

1.3 自定义实现基本指令

命令行参数可以支持各种指令级别的命令行选项的设置!
同样的我们也可以使用命令行参数来完成一些指令操作:通过使用C语言文件操作接口来实现touch命令

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    // ./mytouch 文件名
    // 判断是否合法
    if (argc != 2)
    {
        printf("touch: missing file operand\n");
        return 1;
    }

    FILE *fp = fopen(argv[1], "w");
    if (fp != NULL)
        fclose(fp);

    return 0;
}

朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,欲知后事如何,请听下回分解~,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持!

相关推荐
且从容.13 小时前
ubuntu安装flink
linux·ubuntu·flink
爱和冰阔落15 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨15 小时前
WSL2的安装与使用
linux·wsl
微小的鱼15 小时前
Linux的渲染与显示系统链路
android·java·linux
lisanmengmeng15 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮16 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
Linux-lucky1 天前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu
禁默1 天前
启元 Q1 二次开发实践:Ubuntu 部署与仿真验证,从 PrimeConsole 到 ROS 2 Humble + RViz
linux·运维·ubuntu
skywalk81631 天前
把 去也网站 从 Ubuntu 搬到 FreeBSD:一次 Service Jail + nginx 的部署实录
linux·运维·nginx·ubuntu·freebsd
爱莉希雅&&&1 天前
GitLab 完整学习笔记
linux·运维·服务器