shell编程:定义简单标准命令集
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编程:定义简单标准命令集的更多相关文章
- [shell编程]一个简单的脚本
首先,为什么要学习shell呢?哈哈,当然不是shell能够怎样怎样然后100字. 最近看到一篇博文<开阔自己的视野,勇敢的接触新知识>,读完反思良久.常常感慨自己所会不多,对新知识又有畏 ...
- shell编程中的vim命令说明
vim命令模式: 1.一般命令模式 2.编辑模式 3.底行命令行命令模式 一般命令模式 直接用字符操作编辑模式 可以写文档(跟txt有点像)底行命令模式 先按'ESC',在按下“:”,之后在输出命令 ...
- Linux Shell编程 cut、print命令
cut命令:查找符合条件的列 cut 命令是在文件中提取符合条件的列,虽然 cut 命令用于提取符合条件的列,但是也要一行一行地进行数据提取.也就是说,先要读取文本的第一行数据,在此行中判断是否有符 ...
- Linux Shell编程(24)——命令替换
命令替换 将会重新分配一个命令[1]甚至是多个命令的输出; 它会将命令的输出如实地添加到另一个上下文中. [2]使用命令替换的典型形式是使用后置引用(`...`). 后置引用形式的命令(就是被反引号括 ...
- Linux Shell编程 sort、wc命令
sort命令:字符串排序 sort 命令可以依据不同的数据类型来进行排序.sort 将文件的每一行作为一个单位,相互比较.比较原则是从首字符向后,依次按 ASCII 码值进行比较,最后将它们按升序输出 ...
- Shell编程进阶 1.3data命令
date命令是显示日期时间的命令 date 2016年 01月 01日 星期五 15:05:01 CST 修改时间的选项是 -s date -s "2016-01-01 12:56:10&q ...
- shell编程-1.字符截取命令-列截取cut
- shell编程-1.字符截取命令-列截取awk+printf
- Linux Unix shell 编程指南学习笔记(第四部分)
第十六章 shell脚本介绍 此章节内容较为简单,跳过. 第十七章 条件測试 test命令 expr命令 test 格式 test condition 或者 [ conditio ...
随机推荐
- MySql常用数据类型分析
整数类型 TINYINT.SMALLINT.MEDIUMINT.INT.BIGINT 分别使用8,16,24,32,64位存储空间,值得范围-2的(N-1)方到2的(N-1)方-1.根据需要存储的范围 ...
- knockout+echarts实现图表展示
一.需要学习的知识 knockout, require, director, echarts, jquery.简单的入一下门,网上的资料很多,最直接就是进官网校习. 二.效果展示 三.require的 ...
- Java 快速排序两种实现
快速排序,只要学习过编程的人肯定都听说过这个名词,但是有时候写的时候还真蒙住了,网上搜罗了下以及查阅了"introduction to algorithm",暂时找到两种实现快排的 ...
- 读书笔记--SQL必知必会01--了解SQL
1.1 数据库基础 数据库(datebase) 保存有组织的数据的容器(通常是一个文件或一组文件),是一个以某种有组织的方式存储的数据集合. 数据库管理系统(DBMS,Data Base Manage ...
- 浅谈css的伪元素::after和::before
css中的::after和::before已经被大量地使用在我们日常开发中了,使用他们可以使我们的文档结构更加简洁.但是很多人对::after和::before仍不是特别了解,究竟他们是做什么的?如何 ...
- Python爬虫小白入门(一)写在前面
一.前言 你是不是在为想收集数据而不知道如何收集而着急? 你是不是在为想学习爬虫而找不到一个专门为小白写的教程而烦恼? Bingo! 你没有看错,这就是专门面向小白学习爬虫而写的!我会采用实例的方式, ...
- 在mongoose中使用$match对id失效的解决方法
Topic.aggregate( //{$match:{_id:"5576b59e192868d01f75486c"}}, //not work //{$match:{title: ...
- 每天一个设计模式-2 外观模式(Facade)
每天一个设计模式-2 外观模式(Facade) 1.生活中的示例 客户想要购买一台电脑,一般有两种方法: 1.自己DIY,客户需要知道组成电脑的所有电子器件,并且需要熟悉那些配件,对客户要求较高. ...
- datatables中的Options总结(2)
datatables中的Options总结(2) 五.datatable,列 columnDefs.targets 分配一个或多个列的列定义. columnDefs 设置列定义初始化属性. colum ...
- HttpClient相关
HTTPClient的主页是http://jakarta.apache.org/commons/httpclient/,你可以在这里得到关于HttpClient更加详细的信息 HttpClient入门 ...