【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;
}

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

相关推荐
Ivanqhz2 分钟前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
殷色玫瑰3 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·linux·c语言·c++
꯭自꯭闭꯭4 小时前
DM7主备升级方案
linux·服务器·数据库
用户4107192013254 小时前
VMware 虚拟机Ubuntu 环境linux远程连接失败
linux
lisanmengmeng4 小时前
Nagios邮件报警的配置
linux·运维·服务器
Ruiery4 小时前
Linux 6.6内核 CPU 深度解析(六):cpufreq
linux·运维·服务器
倔强的石头1065 小时前
【Linux指南】动静态库系列(十一):PLT 与延迟绑定:第一次调用动态库函数时发生了什么
linux·人工智能·python
硅基手札5 小时前
【linux内核专栏 08】时间与定时器
linux·运维·服务器
想做小南娘,发现自己是女生喵6 小时前
Linux之Ubuntu入门篇知识总结
linux·运维·服务器
CHEEVEN_QY6 小时前
搅拌摩擦焊FSW工艺参数对焊缝成形影响的实验研究10.1
linux·服务器·数据库