嵌入式总结笔记_第1页
嵌入式总结笔记_第2页
嵌入式总结笔记_第3页
嵌入式总结笔记_第4页
嵌入式总结笔记_第5页
已阅读5页,还剩115页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式总结笔记

•一、c语言

・1、基础知识

・基本数据类型

・short、int、long、char、float、double

・构造数据类型

.数组

.数组

・构造数据类型之一,数组是具有一定顺序关系的若干个变量的集合,

组成数组的各个变量称为数组的元素,数组中各元素的数据类型要求

相同,用数组名和下标确定。数组可以是一维的,也可以是多维的。

.指针

・在计算机内存中,每一个字节单元,都有一个编号,称为地址。在C

语言中,内存单元的地址称为指针,专门用来存放地址的变量,称为

指针变量

•结构体struct

・由一系列具有相同类型或不同类型的数据构成的数据集合,叫做结构。

•共用体union

・在进行某些算法的C语言编程的时候,需要把几种不同类型的变量存

放到同一段内存单元中。也就是利用覆盖技术,使几个变量互相覆盖。

这种几个不同的变量共同占用一段内存的结构类型,在C语言中,被

称作"共用体"类型结构,简称共用体。

・区别

・共用体的成员共用一块内存区,结构体的成员有个自独立的内存区。

所以,共用体的成员,对一个进行修改就会影响别的成员的值,而结

构体则不会。

・枚举enum

・运算符与表达式

•所谓表达式是指由运算符、运算量和标点符号组成的有效序列,其目的是用

来说明一个计算过程。

・程序结构与控制语句

・2、关键字的认识

・static

・这个简单的问题很少有人能回答完全。在C语言中,关键字static有三个明

显的作用:

・1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不

变。

・2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用

函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。

・3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。

那就是,这个函数被限制在声明它的模块的本地范围内使用。

・大多数应试者能正确回答第一部分,一部分能正确回答第二部分,同是很少

的人能懂得第三部分。这是一个应试者的严重的缺点,因为他显然不懂得本

地化数据和代码范围的好处和重要性。

・extern

•extern是计算机语言中的一个关键字,可置于变量或者函数前,以表示变

量或者函数的定义在别的文件中。提示编译器遇到此变量或函数时,在其它

模块中寻找其定义,另外,extern也可用来进行链接指定。

・const

・我只要一听到被面试者说:"const意味着常数",我就知道我正在和一个业

余者打交道。去年DanSaks已经在他的文章里完全概括了const的所有用

法,因此ESP(译者:EmbeddedSystemsProgramming)的每一位读者应

该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只

要能说出const意味着"只读"就可以了。尽管这个答案不是完全的答案,但

我接受它作为一个正确的答案。(如果你想知道更详细的答案,仔细读一下

Saks的文章吧。)

・如果应试者能正确回答这个问题,我将问他一个附加的问题:

・下面的声明都是什么意思?

・constinta;

•intconsta;

・constint*a;

・int*consta;

・intconst*aconst;

./******I

・前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整

型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a

是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,

但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针

(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。顺带提

一句,也许你可能会问,即使不用关键字const,也还是能很容易写出功能

正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下

理由:

・1)关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,

声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很

多时间清理其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当

然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)

・2)通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的

代码。

・3)合理地使用关键字const可以使编译器很自然地保护那些不希望被改变

的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

・volatile

・volatile关键字是一种类型修饰符,用它声明的类型变量表示不可以被某些

编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个

关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以

提供对特殊地址的稳定访问。

•attribute机制取消内存对齐

・我们可以按照自己设定的对齐大小来编译程序,GNU使用_attribute_选

项来设置,比如我们想让刚才的结构按一字节对齐,我们可以这样定义结构

・#和##

・3、数据与指针

・一维数组.一级指针

・所谓一维数组是指只有一个下标的数组。它在计算机的内存中是连续存储的。

・二维数组.二级指针

・数组指针

・指向规定大小和类型的数组的指针(说明他还是个指针)

・指针数组

・存储指针的地址的数组(书名他还是个数组)

・4、函数

・函数三要素(功能参数返回值)

・函数指针

・本质:指针,指向函数,该指针指向函数的地址(函数名)

・一般定义形式:

・〈数据类型〉(*函数指针变量名)(〈形参列表>);

•调用:

・函数指针变量名(〈实参〉);

・(*函数指针变量名)(〈实参〉);

・inttest(inta,intb,int(*pFunt)(intm,intn));

・指针函数

.本质:函数,函数的返回值是指针

・一般定义形式:

・〈数据类型〉*函数名(〈形参列表〉)

•(

・函数体;

•return地址常量/指针变量;

・}

・char*strcpy(char*dest,constchar*src);

・char*strcat(char*dest,constchar*src);

•递归函数

.所谓递归函数是指一个函数的函数体中直接调用或间接调用了该函数自身的

函数。

・递归函数调用的执行过程分为两个阶段:

・递推阶段:从原问题出发,按递归公式递推从未知到已知,最终达到递

归终止条件。

・回归阶段:按递归终止条件求出结果,逆向逐步代入递归公式,回归到

原问题求解。

3

intfunc(intn)

{

if(n<0){

printf("inputerror\n");

return-1;

)

if(n<=1){

return1;

}else(

return(n*func(n-l));3*func(2)—»>2*func(l)

}3*2*1«<2*1«<

}

.回调函数

・5、结构体一联合体一位域一强转

•结构体struct

・1、常用写法

•struct结构体名

•(

.数据类型成员

・}

・2、结构体大小计算

・实际大小可以用sizeof计算

・3、结构体成员访问

・结构体变量名.成员名

・1.不能将一个结构体类型变量作为一个整体加以引用,而只能对结构体

类型变量中的各个成员分别引用

・4、结构体嵌套访问

・2.如果成员本身又属于一个结构体类型,则要用若干个成员运算符,一

级一级的找到最低的一级成员。

・3.对成员变量可以像普通变量一样进行各种运算(根据其类型决定可以

进行的运算)

・4.在数组中,数组是不能彼此赋值的,而结构体类型变量可以直接相互

赋值

・5、结构体数组

・具有相同结构体类型的结构体变量组成的数组

•6、

•联合体union

・访问方式

・union共用体数据类型名{

・成员变量;

•...

•);

•与struct的优劣

・结构体会为每一个成员变量分配空间,共用体分配最大的一个变量所占

的空间。

•6、宏定义一typedef—枚举

・宏定义#define

•重命名typedef

•枚举enum

・7、内存管理

・动态内存的申请和释放

・基础版动态内存分配malloc

・#include<stdlib.h>

•void*malloc(size_tsize);

■/***************************************************************

**功能:在堆中分配内存空间

•*参数:

**@size分配内存空间的大小(byte)

**返回值:成功返回申请到的内存空间首地址,失败返回NULL

_**************************************************************/

・/*释放申请到的内存空间*/

・voidfree(void*ptr);

・升级版动态内存分配

•堆、栈

・6.4G虚拟内存空间划分:

・0G--3G:用户空间

・代码段:

・数据段:

.常量区

・.data段初始化的全局变量和静态局部变量

・.bss段未初始化的全局变量和静态局部变量>>>.bss

段清零

・堆区:用户自己申请的空间

・栈区:局部变量

•3G—4G:内核空间

・c内联汇编

•8、shell脚本编程

•基本命令()

・⑴shell简介

•(1)随着格式Linux系统的图形化程序的不断提高,用户在桌面环境下,通过点击、

拖拽等操作就可以完成大部分的工作.

•(2)然而,许多UbuntuLinux功能使用shell命令来实现,要比使用图形界面交互,

完成的更快、更直接。

•(3)英文单词shell可直译为"贝壳"。"贝壳"是动物作为外在保护的一种工具。

•(4)可以这样认为,Linux中的shell就是Linux内核的一个外层保护工具,并负责完

成用户与内核之间的交互。

Linux内核

Shell

•(5)命令是用户向系统内核发出控制请求,与交互的文本流。

•(6)shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用

户与操作系统的交互。

•(7)当需要重复执行若干命令,可以将这些命令集合起来,加入一定的控制语句,编

辑成为shell脚本文件,交给shell批量执行。

』,用户在命令行提示符下键入命令文本,开始与

Shell进行交互。

接着,Shell将用户的命令或按键转化成内核所

能够理解的指令,

网控制操作系统做出响应,直到控制相关硬件设

』朦后,Shell将输出结果通过Shell提交给用户。

Linux

内核

-

B

u

s

硬件

•注:

•【2】shell命令格式

•(1)最初的UNIXshell经过多年的发展,由不同的机构、针对不同的目录,开发出许

多不同类型的shell程序。

•目前流行的shell主要有几种:

・1)BourneShell(简称sh):它是Unix的第一个shell程序,早已成为工业标准。

目前几乎所有的Linux系统都支持它。不过BourneShell的作业控制功能薄弱,

且不支持别名与历史记录等功能。

•2)CShell(简称csh)

•3)KornShell(简称ksh)

・4)BourneAgainShell:能够提供环境变量以配置用户shell环境,支持历史记录,

内置算数功能,支持通配符表达式,将常用命令内置简化。

・(2)体验shell命令的乐趣

・1)立即关机与重启

・使用系统中的图形界面

•使用shell命令

・在命令行键入一下命令,系统立即关机

•sudoshutdown-hnow

・在命令行键入以下命令,系统立即重启启动

・sudoshutdown-rnow

•sudorebootnow

・2)定时关机重启

・a.T立老师在对学生进行上机测试,时间限定在45分钟内,否则计算机^各自动关

机。

•sudoshutdown-h+45"Thatisall,gameover."

•b.系统正在安装软件,安装时间大概需要持续40分钟左右,软件安装之后需要重

新启动电脑。用户可以不必一直等候在机旁。

•使用下面的命令,计算机会在60分钟后自动重启。

・sudoshutdown-r+60

•⑶shell提示符标识了命令行的开始。($为当前用户#为超级用户)用户在提示符后

面输入一条命令并按Enter键,完成向系统提交命令。

・通常shell命令提示符采用以下的格式:

•username@hostname:directions

・用户名主机名目录名

・1)username:用户名,显示当前登录用户的账户名(执行的命令是whoami)

・2)hostname:主机名,显示登录的主机名,例如若远程登录后,则显示登录的主

机名;(执行的命令是hostname)

•3)direct体。n:目录名,显示当前所处的路径,当在根目录下显示为7",当在用

户主目录下显示为'(执行的命令是pwd)

•(4)通常一条命令包含三个要素:命令名称、选项、参数。命令名称是必须的,选项

和参数都可能是选项。命令格式如下:

•$Command[-Options]ArgumentlArgument2...

•指令选项参数1参数2...

・$:Shell提示符,如果当前用户为超级用户,提示符为,其他用户的提示符均

为"$";

•Command:命令名称,Shell命令或程序,严格区分大小写

・Options:命令选项,用于改变命令执行动作的类型,由引导,可以同时带有

多个选项;

•Argument:命令参数,指出命令作用的对象或目标,有的命令允许带多个参数

・(5)shell命令格式

•1)一条命令的三要素之间用空格隔开;

•2)若将多个命令在一行书写,用分号(;)将各命令隔开;

・3)如果一条命令不能在一行写完,在行尾使用反斜杠(\)表明该条命令结束。

•(6)不带选项和参数

•1)Is命令未带任何参数,列出当前目录中的所有文件,只显示文件名称

・2)命令不带选项或参数,通常意为使用默认选项或参数

・【3】shell命令行操作

•(1)bash除了在命令编辑功能上比sh有很大改进外,还增加了特有功能极大地方便

了用户在shell命令行上的操作。

•1)补齐命令与文件名

•2)查询命令历史

・3)等等

・(2)补齐命令与文件名

・1)在使用Shell命令时,很多用户会经常遇到命令或文件名没有记全的情况。在输

入命令或文件名的前几个字符后,按TAB键或ESC键自动补齐剩余没有输入的字

符串。

•2)如果存在多个命令或文件有相同前缀,shell将列出所有相同前缀的命令或文件。

shell给出的提示信息,帮助用户回忆和完成输入,之后等待用户输入足够的字符。

•3)需要说明的是,连续按两下TAB键或ESC键,用于命令补齐;按一次TAB键,

用于文件名补齐。

•(3)查询命令历史

・1)用户在Shell下的操作是有很大连续性的,曾经输入的命令可能需要多次使用。

当用户在操作中发现问题,需要杳看曾经执行过的操作。Bash将用户曾经输入的

命令序列保存在一个命令历史表中。按"V和"1"键,便可查询历史命令。

•2)BashShell还提供了history命令。该命令将历史表按列表形式,从记录号1

开始,一次性全部显示出来。

・history[numberline]

・3)显然history只能记录有限条的历史命令,默认保留500条命令。

•!命令号(history查看的那个命令)执行这个命令

•4)BashShell将历史命令容量保存在环境变量HISTSIZE中。

・1)使用"echo$HISTSIZE”查看当前历史命令容量;

•2)通过直接赋值的方法,修改当前环境变量。

・echo$HISTSIZE=50

・或者修改家目录下的.bashrc配置文件中的HISTSIZE

•[4]man、passwd、su、echo命令的用法

・(1)获取联机帮助

・1)使用man命令可以找到特定的联机帮助页,并提供简短的命令说明。一般语法

格式为:

•mancommandname

・2)联机帮助页提供了指定命令commandname的相关信息,包括:名称、函数、

语法以及可选参数描述等。

・无论帮助有多长,都遵循这个格式显示。在页面很多的情况下使用PageUp和

PageDown键翻页。最后,使用":q"退出帮助页面。

•(2)通常联机帮助信息包括以下几个部分:

・1)NAME:命令的名称

・2)SYNOPSIS:命令的语法格式

・3)DESCRIPTION:命令的一般描述以及用途

・4)OPTIONS:描述命令所有的参数或选项

・5)SEEALSO:列出联机帮助页中与该命令直接相关或功能相近的其他命令

・6)BUGS:解释命令或其输出中存在的任<可已知的问题或缺陷

・7)EXAMPLES:普通的用法示例

•8)AUTHORS:联机帮助页以及命令的作者

•(3)man3printf查库函数

•man2open查系统调用

•man-aopen会将系统中与open相关的都列出来

・(4)基本系统维护命令

・1)passwd

・a.出于系统安全考虑,Linux系统中的每一个帐号都必须同时具备用户名和密

码。

・b.可以使用passwd命令,为已有账户重新修改用户口令。

•c.需要说明的是,超级用户root可以修改所有其他用户的口令,而普通用户只

能修改自己的用户口令,如果确要修改超级用户或其他用户口令的话,需要具

有超级用户的权限。

•passwd命令的一般语法格式为:

・passwdusername

・2)单独使用passwd命令,意为修改当前用户自己的口令。下面命令实例用于修改

用户自己的口令。

・linux@ubuntu:~$passwd

・Changingpasswordforlinux#修改当前用户口令

•(current)UNIXpassword:#用户输入旧口令

・EnternewUNIXpassword:#用户输入新口令

・RetypenewUNIXpassword:#确认新口令

•passwd:已成功更新密码

•-I:锁定用户

•-u:解锁用户

•3)su

・a.su命令用于临时改变用户身份,具有其他用户的权限。普通用户可以使用

SU命令临时具有超级用户的权限;

・超级用户也可以使用普通用户身份完成一些操作。当需要放弃当前用户身份,

可以使用exit命令切换回来。SU命令的一般语法格式为:

•su[-c|-m-]username

・b.选项"-c"表示执行一个命令后就结束;-m表示仍保留环境变量不变;-表

示转换用户身份时,同时使用该用户的环境。

・单独使用su命令,默认为要转换为超级用户root.下面命令实例临时获取超

级用户root的权限。

•可以从命令提示符中可以看出,"linux”用户使用su命令切换为root用户。

・linux@ubuntu:~$su

・Password:#当前用户输入超级用户的口令

・root@ubuntu:/home/linux#

・4)echo

・a.echo命令用于在标准输出—显示器上显示一段文字,一般起到提示作用.

・echo命令的一般语法格式为:

・echo[-n]information

・b.选项-n表示输出文字后不换行。提示信息字符串可以加引号,也可以不加。

•linux@ubuntu:~$echo"Helloeveryone."#输入信息字符串使用

引号

•Helloeveryone.

・linux@ubuntu:~$echo'$PATH'#严格的原样输出

・$PATH.

•linux@ubuntu:~$echoHelloeveryone.#输入信息字符串不

使用引号,字符串之间用一个空格隔开

・Helloeveryone.

•[5]date、clear、df、du命令的用法

•(1)date

・a.date命令用于显示和设置系统日期和时间。date命令的T殳语法格式为:

・date[-d|-s|-u]datestr

・b.选项-s表示按照datestr日期显示格式设置日期;单独使用date命令,用于显

示系统时钟中当前日期。

・时间的格式为:"hh:mm:ss",日期格式为:"mm/dd/yy"。

•linux@ubuntu:~$date#查看当前时间

・2007年09月16日星期日18:44:45CST

•(2)clear

•a.clear命令用于清除屏幕上的信息。清屏后,sell命令提示符移动到屏幕左上角。

・clear命令的一般语法格式为:

・clear

•b.由于shell命令是逐行执行,执行结果也将随即显示。因此,用户在使用命令终

端窗口时,终端窗口会很快就会被字符占满。

・clear可以帮助清理一下窗口中杂乱的字符显示。

・(3)df

•a.df命令用于查看磁盘空间的使用情况。查看磁盘空间是用户应当经常做的事情,

因为谁也不希望看到根或/var分区在不经意间填满,以便及时清理。df命令的一般

格式为:

•df[-a|-T|-h|-k]Filesystem

•其中,参数Filesystem表示物理文件系统。各选项的含义如表所示。

・选项含义

•-a显示所有物理文件系统的使用情况,包括虚拟文件系统,如/proc、

/sys等

•-T显示物理文件系统的文件格式类型

•-h物理文件系统大小按兆字节为单位显示

•-k物理文件系统大小按千字节为单位显示

・b.从以下命令的执行结果可以看到,这台计算机只有一块硬盘(/dev/sdal),文

件格式类型为Ext3,已经使用36%的存储空间。同时,可以发现计算机上还安装

了CD-ROM(/dev/hdc)、USB存储器(/dev/sdbl)。其他分区均为专用的虚

拟文件系统

linux@ubuntu:-Sdf-T

文件系统1K-块已用可用已用%挂载点

devsdalext378509962664868478731636°o

varruntmpfs2559601042558561%varmn

varlocktmpfs25596002559600%varlock

procbususbusbfs255960842558761%proc/l)ususb

udevtmpfs255960842558761%/dev

devshmtmpfs25596002559600%/dev/shm

Irmtmpfs2559603378822217214%hbmodules2.6.20-16-generic.volatile

devlidciso96607129467129460100%mediacdromO

devsdblvfat2495822116023798085%mediadisk

•c.df命令

・常用参数:

•-a:列出所有文件系统

•-k:列出磁盘的分配情况(KB)

•-h:同-k,但大小以G、M,K单位显示

•-I:仅列出本地文件系统

•例:

・#df-h

・du命令,列出目录和文件所使用的磁盘块数,每块占512个字节。

•常用参数:

•-a:仅列出空闲的文件数

•-h:列出磁盘的使用情况(KB)

•-s:列出总的空闲空间(KB)

•例:

•#du-h/etc

•【10】使用ps命令查看进程

・pid进程号

该进程的状态

占用的旧忆体使用率

占川的CPU使IJ率占牛的记忆体大小

占用的呷拟记Z体大小进半开始”间

connAMD

init(3J

懑(migration^01

[ksoft.irqdxB]

(euentsxB)

逮(khelperJ

(kthrcad1

【keepid]

懑(kblockdxB]

tpdflush)

【pdflush】

•⑴显示进程(process)的动态

・(2)语法:

•ps[options]

•(3)常见的参数:

•-A列出所有的行程

•-w显示加宽可以显示较多的资讯

•-au显示较详细的资讯

•-aux显示所有包含其他使用者的行程(一般结合管道|grep{指定的文件})

•(4)%CPU占用的CPU使用率

・%MEN占用的记忆体使用率

・VS2占用的虚拟记忆体大小

•RSS占用的记忆体大小

•STAT该进程的状态

•START进程开始时间

•TIME执行的时间

・(5)进程的状态标志

•+:在前台

•D:不可中断的静止

・R:正在执行中

・S:阻塞状态

•T:暂停执行

•Z:不存在但暂时无法消除(僵尸态)

•<:高优先级的进程

•N:低优先级的进程

•L:有内存分页分配并锁在内存中

•(6)top命令

•1)监视进程

・2)通常会全屏显示,而且会随着进程状态的变化不断更新

•3)整个系统的信息也会显示,为查找问题提供了便利

•4)可以显示系统总共有多少CPU和内存资源以及负载平衡等信息。

•renice指定优先级,(NI)

Li>|iA9:03:04up3:36.1itsttr,Iu<iddverayu:R.G0,R.00,fl.00

Tasks:48€ot<xl,1runiiiiiif,4?sleepiny>0stopped>0zombie

Cpu(s):B.0Zus,l.?Zsy,niz90.3Zid,B.SzMa,0.叱hi,0.0Zsi

Men:1B97ZHktotal.lZ43lMJkused,6S4N0kFree,8kbuffers

Sutiji:915664k.Okused«315664kfree,Rd83^kc*ichc<l

TIHE*CtJUriAND

HM.1top

00.67init

00.00migration,。

nn.cinksertimjd/fi

06.11euents/0

00.05khelper

00.00kthread

00.00kacuid

•(7)pstree命令

・1)将所有行程以树状图显示,树状图将会以pid(如果有指定)或是以init这个基本进

程为根,如果有指定使用者id,则树状图会只显示该使用者所拥有的进程。

・2)参数:

•-a显示该进程的完整指令及参数,如果是被记忆体置换出去的进程则会加上括号

•-c如果有重覆的进程名,则分开列出

•【11】使用kill命令终止进程(发信号)

・(1)使用kill命令终止进程

•kill[-signal]PID

・signal是信号,PID是进程号

・kill命令向指定的进程发出一个信号signal,在默认的情况下,kill命令向指定进程

发出信号15,正常情况下,将杀死那些不捕捉或不忽略这个信号的进程

•kill-1显示系统现在支持那些信号

・9)SIGKILL

•15)SIGTERM

・shell脚本语法

・1.变量

・【1】shell脚本的基础知识

・(1)shell脚本的本质

・编译型语言

・解释型语言

•shell脚本语言是解释型语言

•shell脚本的本质

•shell命令的有序集合

•(2)shell编程的基本过程

・基本过程分为三步:

・stepl.建立shell文件

・包含任意多行操作系统命令或shell命令的文本文件;

•step2.赋予shell文件执行权限

•用chmod命令修改权限;

•step3.执行shell文件

•直接在命令行上调用shell程序.

・(3)实例

・stepl:建立shell文件(可用任何建立文本文件的方法)

・$catprogl.sh

・date

•Step2:赋予执行权限:(初始文本文件无执行权限)

・$chmod740progl.sh

・$chmodu+xprogl.Ish

•Step3:执行该shell程序

•$progl.sh

・progl.sh:notfound

•(shell在标准搜索路径中找不到progl.sh)

•Step4:指定路径或修改环境变量PATH后执行shell程序

・$./progl.sh

・2009年12月16日星期二14:52:57CST

・[2]shell变量

•(1)shell变量

・shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),

将任何赋给变量的值都解释为一串字符

•Variable=value

•a.count=l

・b.echo$count

・c.DATE='date'

・d.echo$DATE

•⑵BourneShell有如下四种变量:

・1)用户自定义变量

・2)位置变量即命令行参数

•3)预定义变量

•4)环境变量

•(3)用户自定义变量

•1)在shell编程中通常使用全大写变量,方便识别

・$COUNT=1

・2)变量的调用:在变量前加$

・$echo$HOME

・3)LinuxShell/bash从右向左赋值

•$Y=y

・$X=$Y

・$echo$X

・y

・4)使用unset命令删除变量的赋值

・$Z=hello

・$echo$Z

・hello

・$unsetZ

・$echo$Z

・(4)位置变量

•$0与键入的命令行一样,包含脚本文件名

•$1,$2,……$9分别包含第一个到第九个命令行参数

•预定于变量

・$#包含命令行参数的个数

・$@包含所有命令行参数:"$L$2,……$9"

・$?包含前T命令的退出状态

・$*包含所有命令行参数:"$L$2,……$9"

•$$包含正在执行进程的ID号

•⑸常用shell环境变量

•HOME:/etc/passwd文件中列出的用户主目录

•IFS:InternalFieldSeparator,默认为空格,tab及换行符

・PATH:shell搜索路径

•PSI,PS2:默认提示符⑶及换行提示符(>)

・TERM:终端类型,常用的有vtl00,ansi,vt200,xterm等

•2.输入输出

・(1)常用功能性语句(命令)

・read从标准输入读入一行,并赋值给后面的变量,其语法为:

・readvar

・把读入的数据全部赋给var

・readvarlvar2var3

・把读入行中的第一个单词(word)赋给varl,第二个单词赋给var2把其余所有

的词赋给最后一个变量.

・如果执行read语句时标准输入无数据,则程序在此停留等侯,直到数据的到来或被

终止运行。

linuxl@ubuntu:-/tast$vitast.sh

linuxl@ubuntu:~/tast$./tast.sh

bash:./tast.sh:Permissiondenied

linuxl@ubuntu:~/tast$chmodu+xtast.sh

linuxl@ubuntu:~/tast$./tast.sh

inputadate:

19960206

yearmouthday:1996-02-06

linuxl(aubuntu:-/tast$|

QGvUnuxl⑥ubuntu:

1#!/bin/bash

2

3echo"inputadate:**

4readABC

5echo"yearmouthday:$A-$B-$C"

6I_______________________________________________________________________________

•(2)应用实例

•#examplelforread

•echo"Inputyourname:\cn

•readusername

•echo"Yournameis$usernamen

•#example2forread

•echo"Inputdatewithformatyyyymmdd:\c"

•readyearmonthday

•echo"Todayis$year/$month/$day,right?"

•echo"Pressentertoconfirmandcontinue\c"

•readanswer

•echo"Iknowthedate,bye!"

・3.数据计算

・expr命令

•算术运算命令expr主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、

整除(/)和求模(%)等操作。

・例如:

gUnux1@ubuntu:~/tast

linuxl@ubuntu:~/tast$vitast.sh

linuxl@ubuntu:~/tast$chmodu+xtast.sh

linuxl@ubuntu:"/tast$./tast.sh

T=2+10xl0/6

18

<linuxl@ubuntu:~/tast$|

Unux1@)ubuntu:~/tast

1#!/bin/bash

2

3echo"T=2+16xl0/6”

4T=expr2+10\*10/6

5#赋值两边不能加空格

'6用命令需要加上''

7#由于没有数据类型所以数值两边需要加上空格

8echo$T

9

・测试语句

・(l)test语句

・test语句可测试三种对象:

・字符串整数文件属性

・(2)每种测试对象都有若干测试操作符

・例如:

・test"$answer"="yes"

•变量answer的值是否为字符串yes

・test$num-eq18

・变量num的值是否为整数18

•test-dtmp

•测试tmp是否为一个目录名

•(3)字符串测试

1#!/bin/bash

2

3A=116

4B=116

5test$A=$B

6echo$?

7

8readCD

9[$C=$D]

#用【】好像也可以测试

ii#符号两边都需都空格

12echo$?

13

14test-zA

15echo$?

16

17test-nB

18echo$?

19

linuxl(aubuntu:~/tast$vitast.sh

linuxl@ubuntu:~/tast$./tast.sh

0

200100

1

1

0

linuxl@ubuntu:~/tast$,

•si=s2测试两个字符串的内容是否完全一样

・si!=s2测试两个字符串的内容是否有差异

•-Zsi测试si字符串的长度是否为0

•-nsi测试si字符串的长度是否不为0

•(4)整数测试

1#!/bin/bash

2readAB

3[$A-eq$B]

4echo$?

5[$A-ne$B]

6echo$?

7#可以用以代替test但【】两边必须有空

8test$A-gt$B

9echo$?

10

11test$A-ge$B

12echo$?

13

14test$A-It$B

15echo$?

16

17test$A-le$B

18echo$?

linuxl@ubuntu:~/tast$./tast.sh

200100

1

./tast.sh:line5:[:missing']1

2

0

0

1

1

linuxl(aubuntu:~/tast$|

•a-eqb测试a与b是否相等

•a-neb测试a与b是否不相等

•a-gtb测试a是否大于b

•a-geb测试a是否大于等于b

•a-Itb测试a是否小于b

•a-leb测试a是否小于等于b

•(5)文件测试

•-dname测试name是否为一个目录

•-ename测试一个文件是否存在

•-fname测试name是否为普通文件

•-Lname测试name是否为符号链接

•-rname测试name文件是否存在且为可读

•-wname测试name文件是否存在且为可写

•-xname测试name文件是否存在且为可执行

•-sname测试name文件是否存在且其长度不为0

・fl-ntf2测试文件fl是否比文件f2更新

・fl-otf2测试文件fl是否比文件f2更旧

・4控制语句

•[1]条件语句

•(1)结构性语句

・结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及

运行时间等因素来控制程序的运行流程。

・主要包括:条件测试语句(两路分支)、多路分支语句、循环语句、循环控制

语句和后台执行语句等。

•(2)条件语句

•if...then...fi

・语法结构:

•if表达式

•then命令表

・fi

・1)如果表达式为真,则执行命令表中的命令;否则退出if语句,即执行fi后面的

语句。

・2)if和fi是条件语句的语句括号,必须成对使用;

•3)命令表中的命令可以是一条,也可以是若干条。

•(3)复习-文件测试

•-dname测试name是否为一个目录

•-ename测试一个文件是否存在

•-fname测试name是否为普通文件

•-Lname测试name是否为符号链接

•-rname测试name文件是否存在且为可读

•-wname测试name文件是否存在且为可写

•-xname测试name文件是否存在且为可执行

•-sname测试name文件是否存在且其长度不为0

•fl-ntf2测试文件fl是否比文件f2更新

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论