shell是用户操作接口的意思,操作系统运行起来后都会给用户提供一个操作界面,这个界面就叫shell,用户可以通过shell来调用操作系统内部的复杂实现,而shell编程就是在shell层次上进行编程,如Linux中的脚本编程。

shenll运行原理:由消息接收、解析、执行构成的死循环。

命令行shell:该死循环包含3个模块(命令接收、命令解析、命令执行),命令行有一个标准命令集,用户输入的命令若不是标准命令,则提示用户这不是一个合法命令行,然后重新回到命令行让用户输入下一个命令。

常见的shell:uboot、Linux终端、Windows图形界面等

shell实例1:使用printf和scanf做输入回显

#include <stdio.h>
#include <string.h>#define MAX_LINE_LENGTH        256        // 定义命令行长度,命令不能超过这个长度int main(void)
{char str[MAX_LINE_LENGTH];            // 用来存放用户输入的命令内容while (1){// 打印命令行提示符,注意不能加换行printf("Please input your command:#");// 清除str数组以存放新的字符串memset(str, 0, sizeof(str));// shell第一步:获取用户输入的命令scanf("%s", str);// shell第二步:解析用户输入命令// shell第三步:处理用户输入命令printf("%s\n", str);}return 0;
}    

memset(str,0,sizeof(str))

 1 //清除数组
 2 void memset(char *p, int val, int length)
 3 {
 4     int i;
 5
 6     for (i=0; i<length; i++)
 7     {
 8         p[i] = val;
 9     }
10 }

shell实例2:解析用户输入命令并回显

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define MAX_LINE_LENGTH        256            // 命令行长度,命令不能超过这个长度
 4
 5 // 宏定义一些标准命令
 6 #define led                    "led"
 7 #define lcd                    "lcd"
 8 #define pwm                    "pwm"
 9 #define CMD_NUM                3            // 当前系统定义的命令数
10
11 char g_cmdset[CMD_NUM][MAX_LINE_LENGTH];
12
13 // 初始化命令列表
14 static void init_cmd_set(void)
15 {
16     memset(g_cmdset, 0, sizeof(g_cmdset));        // 先全部清零
17     strcpy(g_cmdset[0], led);
18     strcpy(g_cmdset[1], lcd);
19     strcpy(g_cmdset[2], pwm);
20 }
21
22 int main(void)
23 {
24     int i = 0;
25     char str[MAX_LINE_LENGTH];            // 用来存放用户输入的命令内容
26
27     init_cmd_set();
28
29     while (1)
30     {
31         // 打印命令行提示符,注意不能加换行
32         printf("Please input your command:#");
33         // 清除str数组以存放新的字符串
34         memset(str, 0, sizeof(str));
35         // shell第一步:获取用户输入的命令
36         scanf("%s", str);
37         // shell第二步、第三步:解析用户输入命令、处理用户输入命令
39         for (i=0; i<CMD_NUM; i++)
40         {
41             if (!strcmp(str, g_cmdset[i]))
42             {
43                 // 相等,找到了这个命令,执行这个命令所对应的动作。
44                 printf("您输入的命令是:%s,是合法的\n", str);
45                 break;
46             }
47         }
48         if (i >= CMD_NUM)
49         {
50             // 找遍了输入命令都没找到这个符合要求的,则输出相应指示
51             printf("%s不是一个内部合法命令,请重新输入\n", str);
52         }
53     }
54
55     return 0;
56 }

void strcpy(char *dst, const char *src)

1 //复制字符串常量到数组中
2 void strcpy(char *dst, const char *src)
3 {
4     while (*src != '\0')
5     {
6         *dst++ = *src++;
7     }
8 }

int strcmp(const char *cs, const char *ct)

 1 //比较两字符串是否相同
 2 int strcmp(const char *cs, const char *ct)
 3 {
 4     unsigned char c1, c2;
 5
 6     while (1) {
 7         c1 = *cs++;
 8         c2 = *ct++;
 9         if (c1 != c2)
10             return c1 < c2 ? -1 : 1;
11         if (!c1)
12             break;
13     }
14     return 0;
15 }

 shell实例3:shell编程将用户输入的字符串命令按照空格分隔成多个字符串,依次放入cmd二维数组中并解析执行命令

 1 void cmdsplit(char cmd[][MAX_LEN_PART], const char *str)
 2 {
 3     int m = 0, n = 0;
 4     while (*str != '\0')
 5     {
 6         if (*str != ' ')
 7         {
 8             cmd[m][n] = *str;
 9             n++;
10         }
11         else
12         {
13             cmd[m][n] = '\0';
14             n = 0;
15             m++;
16         }
17         str++;
18     }
19     cmd[m][n] = '\0';
20 }

解析命令:

 1 void cmd_parser(char *str)
 2 {
 3     int i;
 4
 5     // 第一步,先将用户输入的次命令字符串分割放入cmd中
 6     cmdsplit(cmd, str);
 7
 8     // 第二步,将cmd中的次命令第一个字符串和cmdset对比
 9     cmd_index = -1;
10     for (i=0; i<CMD_NUM; i++)
11     {
12         // cmd[0]就是次命令中的第一个字符串,也就是主命令
13         if (!strcmp(cmd[0], g_cmdset[i]))
14         {
15             // 相等,找到了这个命令,就去执行这个命令所对应的动作。
17             cmd_index = i;
18
19             break;
20         }
21     }

执行命令

 1 void cmd_exec(void)
 2 {
 3     switch (cmd_index)
 4     {
 5         case 0:
 6             do_cmd_led();            break;
 7         case 1:
 8         case 2:
 9         default:
10             do_cmd_notfound();        break;
11     }
12 }

转载于:https://www.cnblogs.com/CYP01/p/5928211.html

shell编程:定义简单标准命令集相关推荐

  1. linux shell编程 ppt,Linux常用命令与Shell基本编程.ppt

    Linux常用命令与Shell基本编程.ppt Shell 脚本基本编程,无线产品部 katanazhang 2009-11-09,课程目标,linux 常用命令 shell 脚本编程 awk 的用法 ...

  2. linux shell编程多线程和wait命令学习

    http://blog.csdn.net/shuanghujushi/article/details/38186303 最近在使用shell做一些部署工作,在使用过程中,效率一直不高.想提高效率,经过 ...

  3. shell编程之简单四则运算及数组定义

    shell简单四则运算及数组定义 文章目录 shell简单四则运算及数组定义 一.简单四则运算 1. 四则运算符号 2.了解i++和++i 二.数组定义 1. 数组定义 2. 其他变量定义 一.简单四 ...

  4. 从简入难makefile文件编写,Linux C++编程,简单vi命令

     1.一个最基本的C++程序 2.第二个c++程序 3.第一个入门级别的简单的makefile 4.在makefile中定义变量. 5.编写makefile的依赖 如果start:标识后面的某个. ...

  5. linux sh 定义变量,Shell编程定义变量的方式有哪些?

    1. 三种定义变量的方式 (1) 直接赋值 (2) 传参 (传递参数) (3) 交互式设置变量,使用read命令 2. read命令说明 在命令行中使用[root@oldboy scripts]# r ...

  6. Shell编程进阶 1.3data命令

    date命令是显示日期时间的命令 date 2016年 01月 01日 星期五 15:05:01 CST 修改时间的选项是 -s date -s "2016-01-01 12:56:10&q ...

  7. python网络编程实现简单远程命令执行

    前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 一.基本语法 创建套接字 ...

  8. Shell编程(脚本)的常用命令和语句

    一些常用的Shell编程(脚本)命令和语句,可以满足一般需求. 接收到的命令参数: 参数个数: $# 参数值: 命令本身:$0 第一个参数:$1 第二个参数:$2 -- 退出命令: exit echo ...

  9. Shell编程(week4_day1)--技术流ken

    本节内容 1.shell简介 2. shell分类 3. 查看shell 4. 第一个shell脚本 5. shell编程常用命令   5.1 grep   5.2 cut   5.3 sort   ...

最新文章

  1. 纯CSS3进行hover时显示带箭头和动画的tips效果
  2. linux mysql 1030,MySQL报错ERROR 1030 (HY000): 解决过程
  3. 恭喜《软件随想录》得到了大家的一致认可!
  4. 灰度重心法原理与实现
  5. 基于Android的ELF PLT/GOT符号重定向过程及ELF Hook实现(by 低端码农 2014.10.27)
  6. python的匿名函数返回值_Python匿名函数返回值输出问题望指点
  7. 深圳出差 第一天【原创】
  8. mybatis-plus乐观锁
  9. GDAL对于raw数据支持的一个bug
  10. web之Attribute
  11. 服务器2012导出日志文件,MDT2012,client部署日志存放在服务器上
  12. 这些高逼格的网站设计,能看到无数美的东西~
  13. [网络安全自学篇] 七十一.深信服分享之外部威胁防护和勒索病毒对抗
  14. 广州小程序开发公司哪家好?广州小程序开发公司排行前十?
  15. mysql 1032_[MySQL] SQL_ERROR 1032解决办法
  16. WSTMart 1.4.2 发布,让 bug 不再飞
  17. [NOIP2010 普及组] 三国游戏 题解
  18. BurpSuite-Proxy使用
  19. STM32CubeMX+SPI+FATFS读写SD卡
  20. 扫地机器人哪个牌子好用?高性价比扫地机器人推荐

热门文章

  1. java强克隆_java之克隆clone解密
  2. python中copy怎么用_python中的拷贝copy模块怎么使用?
  3. 初识Tcl(七):Tcl 字符串
  4. ruby File类
  5. java jdk安装 以及myeclipse安装
  6. Tomcat 原理篇
  7. mysql 加入列,改动列,删除列。
  8. 活动目录实战系列六(win98客户端加入域)
  9. Vivado级联Modelsim仿真Re-launch问题
  10. 几种常见窗函数及其MATLAB程序实现