C++模拟Linux Shell编写一个自定义命令

 更新时间:2022年12月05日 08:57:01   作者:DEFAULT  
这篇文章主要介绍了C++如何模拟Linux Shell实现编写一个自定义命令,本文通过实例代码进行命令行解析,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

本文将根据C++模拟Linux Shell写一个自定义命令,下面是示例代码,需要的可以参考一下

示例代码

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include "stdarg.h"
using namespace std;

#define MAXLEN 200

void write2File(const std::string &file_string, const std::string str_content);
void readFromFile(string file_string);
string getParamStr(char *ch_pt);
void ProcessByPattern(char *ptr, ...);

/*如果不存在file,则会在当前文件夹下创建file*/
void write2File(const std::string &file_string, const std::string str_content)
{
    if (file_string.empty())
    {
        cout << "empty file string name!" << endl;
        return;
    }
    else if (str_content.empty())
    {
        cout << "empty content string!" << endl;
        return;
    }

    std::ofstream OsWrite(file_string, std::ofstream::app);
    OsWrite << str_content;
    OsWrite << std::endl;
    OsWrite.close();
}

void readFromFile(string file_string)
{
    if (file_string.empty())
    {
        cout << "empty file string name!" << endl;
        return;
    }

    string line;

    std::ifstream labels(file_string.c_str());
    if (!labels.is_open())
    {
        cout << "maybe the file is not exist, can not open the file! " << endl;
        return;
    }

    while (std::getline(labels, line))
    {
        cout << line << endl;
    }
}

string getParamStr(char *ch_pt)
{
    string str;
    char *ptr = new char[MAXLEN];

    ptr = ch_pt;
    str = ptr;

    cout << "parameter: " << str << endl;
    return str;
}

/* ... : 不定参数 */
void ProcessByPattern(char *ptr, ...)
{
    string pattern_str = getParamStr(ptr);
    va_list ap;
    va_start(ap, ptr);

    if (pattern_str == "-r")
    {
        // va_arg(ap, type): 获取下一个type类型的参数
        char *para_ptr = va_arg(ap, char *);
        string readFileStr = getParamStr(para_ptr);
        readFromFile(readFileStr);
    }
    else if (pattern_str == "-w")
    {
        char *file_ptr = va_arg(ap, char *);
        char *cont_ptr = va_arg(ap, char *);

        string filename = getParamStr(file_ptr);
        string cont_str = getParamStr(cont_ptr);
        write2File(filename, cont_str);
    }
    else
    {
        cout << "pattern is empty or pattern number is wrong" << endl;
    }

    va_end(ap);
}

int main(int argc, char *argv[])
{
    // cout<<argc<<endl;
    // cout<<argv[0]<<endl;
    // cout<<argv[1]<<endl;
    if (argc < 2)
    {
        cout << "no arguments pass throught command line" << endl;
        return -1;
    }

    cout << "请输入模式和参数:" << endl;
    cout << "如: -r filename, 即从filename逐行读取内容并打印" << endl;
    cout << "-w filename content, 向filename写入content" << endl;
    cout << "若写入的文件对象不存在,则其将会被创建" << endl;

    ProcessByPattern(argv[1], argv[2], argv[3]);

    return 0;
}

g++ mine_shell_0.1.cpp -o mine_shell_0.1

./mine_shell_0.1 -w y.log 99999999999999999999999999

./mine_shell_0.1 -r y.log  
99999999999999999999999999

想让它更像shell命令的话,三种方式:

  • 软链接
  • bashrc中的别名
  • 把它移动到系统环境目录下

到此这篇关于C++模拟Linux Shell编写一个自定义命令的文章就介绍到这了,更多相关C++自定义命令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言中.与->的用法介绍

    C语言中.与->的用法介绍

    结构体用点,结构体指针用箭头,简单的说,就是一个快捷方式,一个语法糖,这篇文章主要介绍了C语言中.与->的区别及用法,需要的朋友可以参考下
    2023-05-05
  • 基于Qt实现自定义时间选择控件

    基于Qt实现自定义时间选择控件

    这篇文章主要为大家详细介绍了如何基于Qt实现自定义时间选择控件,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • C++使用TinyXml实现读取XMl文件

    C++使用TinyXml实现读取XMl文件

    常见C/C++ XML解析器有Tinyxml、XERCES、squashxml、xmlite、pugxml、libxml等等,本文为大家介绍的是使用TinyXml实现读取XMl文件,需要的可以参考一下
    2023-06-06
  • C++中进行txt文件读入和写入的方法示例

    C++中进行txt文件读入和写入的方法示例

    这篇文章主要给大家介绍了C++中进行txt文件读入和写入的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • 详解C++标准库中处理正则表达式的类std::regex

    详解C++标准库中处理正则表达式的类std::regex

    std 是 C++ 标准库的命名空间,包含了大量标准的 C++ 类、函数和对象,这些类和函数提供了广泛的功能,包括输入输出、容器、算法、字符串处理等,这篇文章主要介绍了C++标准库中提供的用于处理正则表达式的类std::regex,需要的朋友可以参考下
    2024-03-03
  • 一文掌握C语言中的柔性数组

    一文掌握C语言中的柔性数组

    柔性数组在C语言的 C99 标准中,引入的新特性,结构中的最后一个元素的大小允许是未知的数组,即为柔性数组,本文给大家介绍c语言中的柔性数组,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • C语言之malloc动态分配内存和free释放

    C语言之malloc动态分配内存和free释放

    这篇文章主要介绍了C语言之malloc动态分配内存和free释放,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • VC创建进程CreateProcess的方法

    VC创建进程CreateProcess的方法

    这篇文章主要介绍了VC创建进程CreateProcess的方法,涉及VC操作进程的基本技巧,需要的朋友可以参考下
    2015-05-05
  • C++11互斥量的具体使用

    C++11互斥量的具体使用

    互斥量是一种同步原语,是一种线程同步的手段,用来保护多线程同时访问的共享数据,本文主要介绍了C++11互斥量的具体使用,感兴趣的可以了解一下
    2023-11-11
  • C++实现LeetCode(72.编辑距离)

    C++实现LeetCode(72.编辑距离)

    这篇文章主要介绍了C++实现LeetCode(72.编辑距离),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论