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++自定义命令内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++/Php/Python 语言执行shell命令的方法(推荐)

    编程中经常需要在程序中使用shell命令来简化程序,这里记录一下. 1. C++ 执行shell命令 #include <iostream> #include <string> #include <stdio.h> int exec_cmd(std::string cmd, std::string &res){ if (cmd.size() == 0){ //cmd is empty return -1; } char buffer[1024] = {0}; s

  • C++/Php/Python/Shell 程序按行读取文件或者控制台的实现

    写程序经常需要用到从文件或者标准输入中按行读取信息,这里汇总一下.方便使用 1. C++ 读取文件 #include<stdio.h> #include<string.h> int main(){ const char* in_file = "input_file_name"; const char* out_file = "output_file_name"; FILE *p_in = fopen(in_file, "r"

  • C++执行shell命令的多种实现方法

    目录 1.system(执行shell 命令) 2.popen(建立管道I/O) 3.使用vfork()新建子进程,然后调用exec函数族 在linux系统下,用C++程序执行shell命令有多种方式 1.system(执行shell 命令) 相关函数:fork,execve,waitpid,popen 表头文件:#include<stdlib.h> 函数原型:int system(const char * string); 函数说明 :system()会调用fork()产生子进程,由子进程来

  • C++实现模拟shell命令行(代码解析)

    目录 一.解析 二.执行命令函数 三.模拟shell 四.完整代码 四.运行结果 一.解析 /** * 进行命令行解析: * 多个空格 * 分割符:< > | * */ void parse(){ std::string line; getline(std::cin, line); /** 解析字符串 */ int len = line.size(), i=0; std::string tmp; std::vector<std::string> tmp_vc; while(i &l

  • 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

  • Linux Shell如何用ssh命令统计分布式集群信息详解

    目录 一.统计分布式集群信息的思路 二.SSH加密原理 三.SSH命令 四.利用ssh-keygen和ssh-copy-id 实现免密登录 五.Linux Shell 脚本实现 六.ssh只循环一次问题 总结 一.统计分布式集群信息的思路 用免密的远程登陆命令,实现一台机器访问其他集群的机器.因此想要实现有几个重要步骤: 学会shh的使用方法 实现免密登录 编写shell程序 二.SSH加密原理 非对称加密技术是一种加密和解密用的不同密钥的加密方法.其中RSA和DSA就是非对称加密方法.当然非对

  • linux shell脚本学习xargs命令使用详解

    xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据.xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代. xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子. 1.

  • Linux shell中的test命令用法教程

    test命令 test命令是shell环境中测试条件表达式的实用工具,下面来看看test命令的用法介绍: 语法 test(选项) 选项 -b<文件>:如果文件为一个块特殊文件,则为真: -c<文件>:如果文件为一个字符特殊文件,则为真: -d<文件>:如果文件为一个目录,则为真: -e<文件>:如果文件存在,则为真: -f<文件>:如果文件为一个普通文件,则为真: -g<文件>:如果设置了文件的SGID位,则为真: -G<文件&

  • 详解Linux Shell 实现一个获取任意位数的随机密码的脚本

    Shell 命令行,实现一个获取任意位数的随机密码的脚本 每次我们想要获得一个密码的时候都很头疼,于是我之前自己用nodejs写了一个 Shell 脚本.这两天在学习 bash Shell 所以,想用同样的逻辑实现一个获取任意位数随机密码的脚本. 我成功了 :) 分析问题 我们假设我们需要的密码是大小写字母以及数字的组合,并且剔除掉 1,l,0,O,o 这些不便于认知的字符. 然后随机的读取其中的字符,组合成一个我们需要的密码,最后输出. 理顺了逻辑之后,我想到有下面的知识点是我之前不是很熟悉的

  • 详解Linux  Shell 实现一个获取任意位数的随机密码的脚本

    Shell 命令行,实现一个获取任意位数的随机密码的脚本 每次我们想要获得一个密码的时候都很头疼,于是我之前自己用nodejs写了一个 Shell 脚本.这两天在学习 bash Shell 所以,想用同样的逻辑实现一个获取任意位数随机密码的脚本. 我成功了 :) 分析问题 我们假设我们需要的密码是大小写字母以及数字的组合,并且剔除掉 1,l,0,O,o 这些不便于认知的字符. 然后随机的读取其中的字符,组合成一个我们需要的密码,最后输出. 理顺了逻辑之后,我想到有下面的知识点是我之前不是很熟悉的

  • Linux上为你的任务创建一个自定义的系统托盘指示器

    系统托盘图标如今仍是一个很神奇的功能.只需要右击图标,然后选择想要的动作,你就可以大幅简化你的生活并且减少日常行为中的大量无用的点击. 一说到有用的系统托盘图标,我们很容易就想到 Skype.Dropbox 和 VLC: 然而系统托盘图标实际上要更有用得多:你可以根据自己的需求创建自己的系统托盘图标.本指导将会教你通过简单的几个步骤来实现这一目的. 前置条件 我们将要用 Python 来实现一个自定义的系统托盘指示器.Python 可能已经默安装在所有主流的 Linux 发行版中了,因此你只需要

  • Linux shell下30个有趣的命令和提示(推荐)

    这些是我收集了多年的Linux shell的30个有趣的命令和提示. 1. 监控命令(每2秒运行一次) watch "ls -larth" 2. 使用一个端口杀死程序 sudo fuser -k 8000/tcp 3. 限制以下命令的内存使用 ulimit -Sv 1000 # 1000 KBs = 1 MB ulimit -Sv unlimited # Remove limit 4. 使用正则表达式重命名所选文件 rename 's/\.bak$/.txt/' *.bak 5. 获得

  • Linux shell命令帮助格式详解

    前言 linux shell命令通常可以通过-h或--help来打印帮助说明,或者通过man命令来查看帮助,有时候我们也会给自己的程序写简单的帮助说明,其实帮助说明格式是有规律可循的 帮助示例 下面是git reset命令的帮助说明,通过man git-reset可以查看 git reset [-q] [<tree-ish>] [--] <paths>... git reset (--patch | -p) [<tree-ish>] [--] [<paths>

  • Python2.x利用commands模块执行Linux shell命令

    用Python写运维脚本时,经常需要执行linux shell的命令,Python中的commands模块专门用于调用Linux shell命令,并返回状态和结果,下面是commands模块的3个主要函数: 1. commands.getoutput('shell command') 执行shell命令,返回结果(string类型) 复制代码 代码如下: >>> commands.getoutput('pwd') '/home/oracle' 2. commands.getstatus(

随机推荐