shell篇
一、shell介绍
1、shell是操作系统的终端命令行,shell可以理解为软件系统提供给用户操的命令行界面,可以说它是人机交互的
一种方式。
2、我们可以使用系统本身带的shell和操作系统,uboot等软件系统进行交互。具体就是通过shell提供的命令行设
置,输入命令来完成人机交互。
3、上述操作在一般情况下都可以工作的很好但是当我们创建100个名字有规律但是并不同的文件的时候命令行就显
示出了缺点,我们可能去重复100次命令,但是我们可以通过shell脚本文件的方式来解决这个问题。
4、常用的shell语言:sh,bash,csh,ksh,perl,python等。
5、perl和python这种脚本语言常用在网络管理配置等领域。运维人员需要了解这些。
6、脚本语言一般在嵌入是中应用,主要是用来做配置。(一个复杂的嵌入式程序都是可配置的,配置过程使用脚本
语言来实现的)
7、linux下最常用的脚本就是bash,我们学习的也是bash脚本。
8、shell脚本的运行机制:shell解码器会逐行的解释程序代码,然后一行一行的去运行。每一句对应的二进制代码
可能都编译好了,我们只是调用已经编译好的代码。
二、动手写一个shell脚本
1、shell脚本程序时文本格式的,只要是文本编辑器都可以去编辑它。
编译器 不涉及,因为shell是解释性语言,直接编辑完就可以运行。
2、shell脚本的运行方法,
(1)、./xx.sh ,和运行二进制可执行程序方法一样。这样运行shell脚本需要有该文件的执行权限。
(2)、source xx.sh,source是linux的一个命令,这个命令就是用来执行脚本程序的。
(3)、bash xx.sh, bash是一个脚本程序解释器,本质上是一个可执行程序。这样执行相当于我们执行了bash
程序,然后把xx.sh作为argv[1]传给他运行。
(4)、shell程序的第一行一般都是:#!/bin/sh 这行话以#!开始,后面加一个pathname,这句话的意思
是shell程序执行时被哪个解释器解释执行。那么这句话的意思就是我们这个shell文件将被当前机器中的/bin
目录下的sh可执行程序执行。

结果:
三、shell脚本的语法
1、变量的定义和初始化。shell是弱类型语言(语言中有明确的类型声明则属于强类型语言,否则为弱类型语言),
shell中变量赋值变量和值都要紧挨着=。
2、变量的引用$,使用时$后面紧跟着要引用的变量名。如上面的例子。
3、shell中使用字符串可以不加双引号,直接使用。而且有空格时也可以但是缺点就是不能输出转译字符。
4、单引号中:完全字面替换(不可包含单引号本身)
5、双引号中:$加变量名可以去变量的值
反引号扔表示命令替换
可以用\来使用转译功能

结果:
6、shell中的选择分支结构
(1)、典型if语言格式

结果:
注意:$a加双引号,条件是写在中括号中的,中括号的前后都有一个空格
(2)、各种判断条件
-f filename 判断文件是否存在 -d dirname 判断目录是否存在
关于数字:-eq相等,-gt大于,-lt小于,-ge大于等于,-le小于等于
(eq就是equal,gt就是greater than,lt就是less than,ge就是greater or equal,le就是less or equal)
(3)、for循环

结果:
注意:for循环的括号是两个小括号
(4)while循环

结果:
至此shell就介绍的差不多了,但是我只是浅显的介绍了一些基本的东西,要是
有兴趣的,可以自行学习
但是嵌入式开发只是将它当作工具所以可以看懂会改就行了。
Makefile篇
一、Makefile基础介绍
1、Makefile的作用和意义:工程项目中c文件太多管理不方便,因此用Makefile来做项目管理,方便
编译链接过程 。
2、uboot和linux kernel本质上都是c语言的项目,都由很多个文件组成,因此都需要通过Makefile来
管理,所以在分析uboot之前必须对Makefile有所了解。
3、Makefile的组成:目标、依赖、命令
(1)、目标就是我们要去make xxx的那个xxx,就是我们想要通过操作生成的文件。
(2)、依赖就是用来生成目标的原材料
(3)、命令就是加工方法,所以make xxx的过程其实就是使用命令将依赖加工成目标的过程。
4、通配符%的使用,代表一个或几个字母。例如%.o就是所有以.o结尾的文件。
5、自动推导:所谓自动推导其实就是Makefile的规则。当Makefile需要一个目标时,它会把这个目标去套
规则说明,则Makefile会试图寻找这个规则中的依赖,如果找到则会执行这个规则用依赖生成目标。
6、Makefile中定义和使用变量,和shell脚本非常相似。相似是说:都没有变量类型,直接定义使用,
引用变量时用$var。
7、伪目标(.PHONY)
(1)、伪目标意思是这个目标本身不代表一个文件,执行这个目标不是为了得到某个文件或东西,而是
单纯为了执行目标下面的命令。
(2)、 伪目标一般都没有依赖,不加依赖的意思是无条件执行。
(3)、伪目标可以直接写,不影响使用。但有时候为了明确这个目标是伪目标还是在伪目标前加上.PHONY
以此来声明它是伪目标。
8、Makefile中引用其他Makefile(include指令)
(1)、有时候Makefile总体比较复杂会分为好几个子Makefile这时候用include指令来添加子Makefile。
(2)、Makefile中注释的使用#,和shell一样。
(3)、命令前加@代表静默执行,即不显示执行过程。
9、Makefile中几种不同的变量赋值运算符
(1)、= 最简单的赋值
(2)、 := 一般情况下也是赋值。
以上这两个大部分情况是一样的。但是用=赋值被解析的值取决于最后一次复制时的值。而:=赋值
时就地解析,只用往前看即可。
(3)、?= 如果变量在前面未经赋值(即未被定义过)则赋值。
(4)、+= 用来给一个已经赋值的变量继续赋值,新的值会被加在后面。
注意:Makefile并不要求=前后有空格或者无空格。shell要求=前后必须无空格。
10、Makefile的环境变量
(1)、Makefile中用export导出的就是环境变量。一般情况下要求环境变量名用大写,普通变量
名用小写。
(2)、环境变量和普通变量不同,可以这样理解:环境变量类似于整个工程中所用Makefile中使用
的全局变量。而普通变量只是当前Makefile中使用的局部变量。
(3)、Makefile中可能有一些环境变量可能是makefile本身自己定义的内部的环境变量或者是当前的
执行环境提供的环境变量(譬如我们在make执行时给makefile传参。make CC=arm-linux-gcc,
其实就是给当前Makefile传了一个环境变量CC,值是arm-linux-gcc。我们在make时给makefile
传的环境变量值优先级最高的,可以覆盖makefile中的赋值)。这就好像C语言中编译器预
定义的宏__LINE__ __FUNCTION__等一样。
11、Makefile中使用通配符
(1)、* 若干个任意字符
(2)、? 1个任意字符
(3)、[] 将[]中的字符依次和外面结合匹配
12、Makefile的自动变量
(1)为什么使用自动变量。在有些情况下文件集合中文件非常多,描述的时候很麻烦,所以我们Makefile
就用一些特殊的符号来替代符合某种条件的文件集,这就形成了自动变量。
(2)自动变量的含义:预定义的特殊意义的符号。就类似于C语言编译器中预制的那些宏__FILE__一样。
(3)常见自动变量:
$@ 规则的目标文件名
$< 规则的依赖文件名
$^ 依赖的文件集合
欢迎各位指出不足之处
本文介绍了Shell的基础知识,包括其作为操作系统命令行界面的角色,如何通过shell脚本自动化任务,以及常见的shell语言。同时,文章还探讨了shell脚本的编写和运行方法,包括使用source和bash执行脚本。接着,转向Makefile,阐述了Makefile在项目管理中的作用,以及其组成、通配符、自动推导、变量和伪目标的概念。
459

被折叠的 条评论
为什么被折叠?



