16.1.shell是什么鬼
16.1.1、壳与封装
(1)shell就是壳的意思,在计算机中经常提到shell是用户操作接口的意思。
(2)因为计算机程序本身很复杂,里面的实现和外面的调用必须分开。接口本身就是对内部复杂的实现的一种封装,外部只需要通过接口就可以很容易的实现效果,但是却不用理会内部实现的复杂性和原理。
16.1.2、程序或操作系统的用户接口
(1)操作系统运行起来后都会给用户提供一个操作界面,这个操作界面就叫shell。用户可以通过shell来调用操作系统内部的复杂实现。
(2)shell编程就是在shell层次上进行编程。譬如linux中的脚本编程、windows中的批处理。
16.1.3、两种shell:GUI和cmdline
(1)GUI(图形用户界面),特点是操作简单、易学易用,适合使用电脑来工作的人。
(2)cmdline(命令行界面),譬如linux的终端和windows的cmd,特点是不易用易学,优点是可以进行方便的shell编程,适合做开发的人。
(3)展望:将来的shell应该是声音图像等接口的。
16.1.4、shell的运行原理:由消息接收、解析、执行构成的死循环
(1)我们主要分析命令行shell的运行原理。
(2)命令行shell其实就是一个死循环。这个死循环包含3个模块,这3个模块是串联的,分别是命令接收、命令解析、命令执行。
(3)命令行有一个标准命令集,用户在操作的时候必须知道自己想要的操作用通过哪个命令来实现,不能随便输入命令。如果用户输入了一个不是标准命令的命令(不能识别的命令),提示用户这不是一个合法命令,然后重新回到命令行让用户输入下一个命令。
(4)用户输入命令的界面是一个命令行,命令行的意思就是用户输入的命令是以行为单位的,更好理解的说用户输入的命令在用户按下回车键之后就算是结束了,shell可以开始接收了。
16.1.5、shell举例:uboot、linux终端、Windows图形界面等
(1)常见的shell,uboot就是一个裸机程序构成的shell(本课程要完成的shell也是裸机的),clinux中断和windows的cmd是操作系统下的命令行shell。windows图形界面、ubuntu图形界面、android的图形界面这些都是图形界面的shell。突然想到另一个类型的shell,网页类型的shell,典型代表就是路由器。
16.2.shell实战1-从零写最简单shell
16.2.1、使用printf和scanf做输入回显
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#include <stdio.h>
#include <string.h>
#define MAX_LINE_LENGTH 256 // 命令行长度,命令不能超过这个长度
int
main(
void
)
{
char
str[MAX_LINE_LENGTH];
// 用来存放用户输入的命令内容
while
(1)
{
// 打印命令行提示符,注意不能加换行
printf
(
"aston#"
);
// 清除str数组以存放新的字符串
memset
(str, 0,
sizeof
(str));
// shell第一步:获取用户输入的命令
scanf
(
"%s"
, str);
// shell第二步:解析用户输入命令
// shell第三步:处理用户输入命令
printf
(
"%s\n"
, str);
}
return
0;
}
|
16.2.2、定义简单命令集
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
#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, 0,
sizeof
(g_cmdset));
// 先全部清零
strcpy
(g_cmdset[0], led);
strcpy
(g_cmdset[1], lcd);
strcpy
(g_cmdset[2], pwm);
}
|