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 ()
{
// 打印命令行提示符,注意不能加换行
printf("Please input your command:#");
// 清除str数组以存放新的字符串
memset(str, , sizeof(str));
// shell第一步:获取用户输入的命令
scanf("%s", str);
// shell第二步:解析用户输入命令 // shell第三步:处理用户输入命令
printf("%s\n", str);
} return ;
}

memset(str,0,sizeof(str))

 //清除数组
void memset(char *p, int val, int length)
{
int i; for (i=; i<length; i++)
{
p[i] = val;
}
}

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

 #include <stdio.h>
#include <string.h>
#define MAX_LINE_LENGTH 256 // 命令行长度,命令不能超过这个长度 // 宏定义一些标准命令
#define led "led"
#define lcd "lcd"
#define pwm "pwm"
#define CMD_NUM 3 // 当前系统定义的命令数 char g_cmdset[CMD_NUM][MAX_LINE_LENGTH]; // 初始化命令列表
static void init_cmd_set(void)
{
memset(g_cmdset, , sizeof(g_cmdset)); // 先全部清零
strcpy(g_cmdset[], led);
strcpy(g_cmdset[], lcd);
strcpy(g_cmdset[], pwm);
} int main(void)
{
int i = ;
char str[MAX_LINE_LENGTH]; // 用来存放用户输入的命令内容 init_cmd_set(); while ()
{
// 打印命令行提示符,注意不能加换行
printf("Please input your command:#");
// 清除str数组以存放新的字符串
memset(str, , sizeof(str));
// shell第一步:获取用户输入的命令
scanf("%s", str);
// shell第二步、第三步:解析用户输入命令、处理用户输入命令
for (i=; i<CMD_NUM; i++)
{
if (!strcmp(str, g_cmdset[i]))
{
// 相等,找到了这个命令,执行这个命令所对应的动作。
printf("您输入的命令是:%s,是合法的\n", str);
break;
}
}
if (i >= CMD_NUM)
{
// 找遍了输入命令都没找到这个符合要求的,则输出相应指示
printf("%s不是一个内部合法命令,请重新输入\n", str);
}
} return ;
}

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

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

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

 //比较两字符串是否相同
int strcmp(const char *cs, const char *ct)
{
unsigned char c1, c2; while () {
c1 = *cs++;
c2 = *ct++;
if (c1 != c2)
return c1 < c2 ? - : ;
if (!c1)
break;
}
return ;
}

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

 void cmdsplit(char cmd[][MAX_LEN_PART], const char *str)
{
int m = , n = ;
while (*str != '\0')
{
if (*str != ' ')
{
cmd[m][n] = *str;
n++;
}
else
{
cmd[m][n] = '\0';
n = ;
m++;
}
str++;
}
cmd[m][n] = '\0';
}

解析命令:

 void cmd_parser(char *str)
{
int i; // 第一步,先将用户输入的次命令字符串分割放入cmd中
cmdsplit(cmd, str); // 第二步,将cmd中的次命令第一个字符串和cmdset对比
cmd_index = -;
for (i=; i<CMD_NUM; i++)
{
// cmd[0]就是次命令中的第一个字符串,也就是主命令
if (!strcmp(cmd[], g_cmdset[i]))
{
// 相等,找到了这个命令,就去执行这个命令所对应的动作。
cmd_index = i; break;
}
}

执行命令

 void cmd_exec(void)
{
switch (cmd_index)
{
case :
do_cmd_led(); break;
case :
case :
default:
do_cmd_notfound(); break;
}
}

shell编程:定义简单标准命令集的更多相关文章

  1. [shell编程]一个简单的脚本

    首先,为什么要学习shell呢?哈哈,当然不是shell能够怎样怎样然后100字. 最近看到一篇博文<开阔自己的视野,勇敢的接触新知识>,读完反思良久.常常感慨自己所会不多,对新知识又有畏 ...

  2. shell编程中的vim命令说明

    vim命令模式:  1.一般命令模式 2.编辑模式 3.底行命令行命令模式 一般命令模式 直接用字符操作编辑模式 可以写文档(跟txt有点像)底行命令模式 先按'ESC',在按下“:”,之后在输出命令 ...

  3. Linux Shell编程 cut、print命令

    cut命令:查找符合条件的列 cut  命令是在文件中提取符合条件的列,虽然 cut 命令用于提取符合条件的列,但是也要一行一行地进行数据提取.也就是说,先要读取文本的第一行数据,在此行中判断是否有符 ...

  4. Linux Shell编程(24)——命令替换

    命令替换 将会重新分配一个命令[1]甚至是多个命令的输出; 它会将命令的输出如实地添加到另一个上下文中. [2]使用命令替换的典型形式是使用后置引用(`...`). 后置引用形式的命令(就是被反引号括 ...

  5. Linux Shell编程 sort、wc命令

    sort命令:字符串排序 sort 命令可以依据不同的数据类型来进行排序.sort 将文件的每一行作为一个单位,相互比较.比较原则是从首字符向后,依次按 ASCII 码值进行比较,最后将它们按升序输出 ...

  6. Shell编程进阶 1.3data命令

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

  7. shell编程-1.字符截取命令-列截取cut

  8. shell编程-1.字符截取命令-列截取awk+printf

  9. Linux Unix shell 编程指南学习笔记(第四部分)

    第十六章  shell脚本介绍 此章节内容较为简单,跳过. 第十七章   条件測试 test命令 expr命令 test  格式  test  condition     或者  [ conditio ...

随机推荐

  1. SQL Server-简单查询语句,疑惑篇(三)

    前言 对于一些原理性文章园中已有大量的文章尤其是关于索引这一块,我也是花费大量时间去学习,对于了解索引原理对于后续理解查询计划和性能调优有很大的帮助,而我们只是一些内容进行概括和总结,这一节我们开始正 ...

  2. 梯度提升树(GBDT)原理小结

    在集成学习之Adaboost算法原理小结中,我们对Boosting家族的Adaboost算法做了总结,本文就对Boosting家族中另一个重要的算法梯度提升树(Gradient Boosting De ...

  3. Hawk 4.2 过滤器

    过滤器可以在流中,过滤掉不符合条件的文档.当然也可勾选反向,此时只会留下不符合条件的文档. 空对象过滤器 最为常用,需要列名,可以过滤掉所有内容为Null,或字符串全部都是空字符的情况 数值范围过滤 ...

  4. PHP的学习--使用phar打包

    前段时间写了几个PHP的脚本,但是因为脚本的项目是基于composer安装的,给别人使用的时候不太方便,就希望能够打包成一个能直接使用的文件. 搜索了一下,发现可以使用phar打包. 假设我们有如下一 ...

  5. Oracle 11g RAC 应用补丁简明版

    之前总结过<Oracle 11.2.0.4 RAC安装最新PSU补丁>, 这次整理为简明版,忽略一切输出的显示,引入一些官方的说明,增加OJVM PSU的补丁应用. 环境:RHEL6.5 ...

  6. Python基础(三)

    本章内容: 深浅拷贝 函数(全局与局部变量) 内置函数 文件处理 三元运算 lambda 表达式 递归(斐波那契数列) 冒泡排序 深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝 ...

  7. 前端打包构建工具gulp快速入门

    因为之前一直有人给我推荐gulp,说他这里好哪里好的.实际上对我来说够用就行.grunt熟悉以后实际上他的配置也不难,说到效率的话确实是个问题,尤其项目大了以后,目前位置遇到的项目都还可以忍受.不过不 ...

  8. 深入理解脚本化CSS系列第二篇——查询计算样式

    × 目录 [1]getComputedStyle [2]注意事项 [3]currentStyle[4]IE 前面的话 元素的渲染结果是多个CSS样式博弈后的最终结果,这也是CSS中的C(cascade ...

  9. WebUtils-网络请求工具类

    网络请求工具类,大幅代码借鉴aplipay. using System; using System.Collections.Generic; using System.IO; using System ...

  10. (转)SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步

    最近在琢磨主从数据库之间的同步,公司正好也需要,在园子里找了一下,看到这篇博文比较详细,比较简单,本人亲自按步骤来过,现在分享给大家. 在这里要提醒大家的是(为了更好的理解,以下是本人自己理解,如有错 ...