網站首頁 編程語言 正文
本文將根據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中的別名
- 把它移動到系統環境目錄下
原文鏈接:https://segmentfault.com/a/1190000042974006
相關推薦
- 2021-12-15 詳談浮點精度(float、double)運算不精確的原因_C 語言
- 2024-02-16 SpringBoot的默認組件掃描
- 2022-05-24 調用無文檔說明的?Web?API過程描述_相關技巧
- 2022-11-17 Android使用元數據實現配置信息的傳遞方法詳細介紹_Android
- 2022-07-16 from server (NotFound): pods “XXX“ not found
- 2022-06-07 ASP.NET?Core服務生命周期_基礎應用
- 2021-12-27 readAsText 讀取本地文件
- 2022-05-22 使用Supervisor守護ASP.NET?Core應用程序進程_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支