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. React.js入门必须知道的那些事

    首先,React.js是facebook在2013年5月开源的一个前端框架,React不是一个MVC框架,它是构建易于可重复调用的web组件,侧重于UI, 也就是view层, React为了更高超的性 ...

  2. css随笔记

    使用伪类写边框部分三角 右上角三角形 border-top:6px solid #c1ddf7 border-left:6px solid transparent 右下角三角形 border-bott ...

  3. Keil> 编译器特有的功能 > 关键字和运算符 > __weak

    __weak 此关键字指示编译器弱导出符号. 可以将 __weak 关键字应用于函数和变量声明以及函数定义. 用法 函数和变量声明 对于声明,此存储类指定一个 extern 对象声明,即使不存在,也不 ...

  4. QML 从无到有 3 (自动更新)

    新的需求出来啦,需要自动更新功能,不怕程序升级了. 自动更新,QML不好写,需要c++来辅助,这里就涉及QML中调用c++功能(这里就不写了,百度一下,很多). 思路:获取版本>下载程序> ...

  5. 关于Linux下转换oracle字符集

    前阵子给以同事导oracle数据库,但是发现导入后数据都是乱码,下面是自己解决这个问题的一些小整理. 比如: #su oralce $export ORACLE_SID=orcl $export OR ...

  6. Maven远程仓库的认证

    大部分远程仓库无须认证就可以访问,但有时处于安全方面的考虑,我们需要提供认证信息才能访问一些远程仓库.为了防止非法的仓库访问,管理员为每个仓库提供了一组用户名及密码. 这时,为了能让Maven访问仓库 ...

  7. 扩展JS Date对象时间格式化功能

    在自己JS代码中引入一下代码: Date.prototype.format =function(format) { var o = { "M+" : this.getMonth() ...

  8. Windows消息机制

    Windows的消息系统是由3个部分组成的: · 消息队列.Windows能够为所有的应用程序维护一个消息队列.应用程序必须从消息队列中获取消息,然后分派给某个窗口.· 消息循环.通过这个循环机制应用 ...

  9. CSS3之过渡及2D变换

    transition过渡 transition-duration:; 运动时间 transition-delay:; 延迟时间 transition-timing-function:; 运动形式 ea ...

  10. 兼容IE8 input的placeholder的文字显示

    if( !('placeholder' in document.createElement('input')) ){ $('input[placeholder],textarea[placeholde ...