linux下go语言脚本实现,Linux下实现一个简易的shell脚本-Go语言中文社区

文章目录

在Linux系统下我们都是通过在命令行敲击一些命令来实现一些我们想要的操作,只要了解一些进程程序替换的知识,我们也可以自己写一个简易的shell。

#什么是shell 脚本

最简单的解释,一个shell 脚本就是一个包含一系列命令的文件。shell 读取这个文件,然后执行文件中的所有命令,就好像这些命令已经直接被输入到了命令行中一样。

Shell 有些独特,因为它不仅是一个功能强大的命令行接口, 也是一个脚本语言解释器。我们将会看到,大多数能够在命令行中完成的任务也能够用脚本来实现,同样地,大多数能用脚本实现的操作也能够在命令行中完成。

由于能力有限,在这里只能实现一个很简单的命令行脚本,而且...bug很多:比如说之间按回车键会出现死循环,比如说第一个字符串不是正确的命令时也不会报错,但是如果是第二个往后的字符串是错误的就会报错....(很神奇,我也不知道为什么...还望各路大佬多多指教~)

#怎样编写一个shell 脚本

1.获取命令行

2.解析命令行

3.建立一个子进程

4.替换子进程(execvp)

5.父进程等待子进程(wait)

#代码

#include

#include

#include

#include

#include

int argc=0;

char*argv[32];

//获取命令行字符串

int param_parse(char* buff)

{

if(buff==NULL){

return -1;

}

char* ptr=buff;

char* tmp=ptr;

while((*ptr)!=' '){

//当遇到空格,并且下一个位置不是空格的时候

//将空格位置置为' '

//用argv[argc]来保存这个字符串的位置

if(*ptr==' '&&*(ptr+1)!=' '){

tmp=ptr+1;

}

ptr++;

}

argv[argc++]=tmp;

argv[argc]=NULL;

return 0;

}

函数替换

int exec_cmd()

{

int pid=0;

pid=fork();

if(pid<0){

return -1;

}else if(pid==0){

execvp(argv[0],argv);

exit(0);

}

int statu;

wait(&statu);

//判断子进程是否是代码运行完毕退出

if(WIFEXITED(statu)){

//获取到子进程的退出码,转换为文本信息打印

printf("%sn",strerror(WEXITSTATUS(statu)));

}

return 0;

}

int main()

{

while(1){

printf("MyShell>");

char buff[1024]={0};

//%[^n]获取数据直到遇到n为止

//%*c 清空缓冲区,数据都不要了

scanf("%[^n]%*c",buff);

printf("%sn",buff);

argc=0;

memset(argv,0,sizeof(argv));

param_parse(buff);

exec_cmd();

}

return 0;

}

2cb1abf6014e40bdc6864047746125e6.png

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值