嵌入式Linux shell和makefile基础

一、shell脚本的运行机制

1、c语言机制:编写源代码->编译连接生成可执行二进制文件;
2、脚本程序机制:编写好源代码后即可直接运行,没有编译过程;
3、shell程序是解释运行,所谓解释运行就是说当我们执行一个shell程序时,shell解析器会逐行的解释shell程
   序代码,然后一行一行的去运行。(顺序结构)
4、CPU实际只认识二进制代码,根本不认识源代码。脚本程序源代码不是二进制代码,CPU也不认识,也不能
   直接执行。只不过脚本程序的编译连接过程不是以脚本程序源代码为单位进行的,而是在脚本运行过程中逐行
   的解释执行时才会完成脚本程序源代码转成二进制的过程。

二、shell编辑器、编译器、运行方法

1、shell程序是文本格式的,只要是文本编辑器都可以。但是因为我们的shell是要在Linux系统下运行的,所以换
   行符必须是 '\n' ,而windows下的换行符是 "\r\n" ,因此windows中的编辑器写的shell不能在Linux下
   运行。所以编辑shell脚本需要用到Linux环境下的编辑器工具。
2、编译器:不涉及,因为设立了是解释性语言,直接编辑完就可以运行。
3、shell程序运行的方式有多钟,这里主要介绍三种:
	第一种:./xx.sh,和运行二进制可执行程序方法一样。这种方式要求shell程序必须具有可执行权限。
		  chmod a+x xx.sh 来添加可执行权限。
	第二种:source xx.sh,source是Linux的一个命令,这个命令就是用来执行脚本程序的。这种方式不需要
		   脚本具有可执行权限。
	第三种:bash xx.sh,bash是一个脚本程序解释器,本质上是一个可执行程序。这样执行相当于我们执行了
		 bash程序,然后把 xx.sh 作为argv[1]传给他运行(为什么不是argv[0],因为argv[0]是 xx.sh);
4、shell代码第一行一般都是:#!/bin/sh  以#!开始,后面加上一个pathname,这行话的意思就是制定shell
   程序执行时被哪个解释器解释执行。所以我们这里写成/bin/sh 意思就是shell文件被当前机器中的/bin目录下
   的 sh可执行程序执行;在Ubuntu上面默认使用的解释器sh其实不是bash,而是dash。#号开头的为注释行。

三、shell中变量定义和引用

1、变量的初始化和定义:shell是弱类型语言(强类型语言:语言中的变量如果有明确的类型。反之则为弱类型语言),
   不需要制定类型,也没有类型概念。
2、变量赋值,类似于C语言。
3、变量引用,shell中引用一个变量必须使用$符号,$符号就是变量解引用符号。
注意:$符号后面跟一个字符串,这个字符串就会被当作变量去解析,如果该变量未定义,则该变量的值为空;
注意:变量的引用可以用$var,也可以用${var}。
4、shell中调用Linux命令:a、直接输入命令执行,b、用反引号(`)括起来执行。如果需要得到Linux命令执行
   后的返回值,我们就需要用反引号括起来执行。

四、shell中的分支结构

1、if语句
if [表达式]; then
	xxx
	yyy
	zzz
else
	xxx
	ddd
	uuu
fi
2、if语句的典型应用
	判断文件是否存在。(-f),[  ] 里面前后都有空格,不能省略。
	判断目录是否存在     (-d)。
	判断字符串是否相等("str1" = "str2"),注意是一个等号。
	判断数字是否相等(-eq)、大于(-gt)、小于(-lt)、大于等于(-ge)、小于等于(-le)。
	判断字符串是否为空(-z),注意-z判断时如果变量本身没定义会报错
	
3、for循环
4、while循环
5、echo的创建和追加输入文件
	a、shell中可以使用echo指令新建一个文件,并且通过 > 符号将指定内容传入文件中。
	b、可以使用echo指令配合追加符号 >> 向一个已经存在的文件末尾追加输入内容。
6、shell中的case语句没有break;
7、调用shell程序可以传递参数:
	(1)C语言中可以通过main函数的argc和argv给程序传参)
	(2)shell程序本身也可以在调用时传参给他。在shell程序内部使用传参也是使用的一些特定符号来表示的,
	包括:$#表示调用该shell时传参的个数。($#计数时只考虑真正的参数个数$0、$1、$2·····则依次表示传参
	的各个参数。
	C语言:./a.out aa bb cc 	argc = 4, argv[0] = ./a.out, argv[1]是第一个有效参数····
	shell:source a.sh aa bb cc  $# = 3, $0是执行这个shell程序的解析程序的名字,$1是第一个有效
	      参数的值,$2是第2个有效参数的值·····
8、while循环和case语言和传参结合
	(1)shell中的break关键字和C语言中意义相同(都是跳出)但是用法不同。因为shell中case语句默认不用
	   break的,因此在shell中break只用于循环跳出。所以当while中内嵌case语句时,case中的break是
	   跳出外层的while循环的,不是用来跳出case语句的。
	(2)shell中的$# $1等内置变量的值不是不可变的,而是可以被改变,被shift指令改变。shift指令有点像
	   左移运算符,把我们给shell程序的传参左移了一个移出去了,原来的$2变成了新的$1,原来的$#少了1个。

五、makefile基础

1、makefile的作用和意义
	(1)工程项目中c文件太多管理不方便,因此用Makefile来做项目管理,方便编译链接过程。
	(2)uboot和linux kernel本质上都是C语言的项目,都由很多个文件组成,因此都需要通过Makefile来管理。
	   所以要分析uboot必须对Makefile有所了解。
2、目标、依赖、命令
	(1)目标就是我们要去make xxx的那个xxx,就是我们最终要生成的东西。
	(2)依赖是用来生成目录的原材料
	(3)命令就是加工方法,所以make xxx的过程其实就是使用命令将依赖加工成目标的过程。
3、通配符%和Makefile自动推导(规则)
	(1)%符号是Makefile中的通配符,代表一个或几个字母。也就是说%.o就代表所有以.o为结尾的文件。
	(2)所谓自动推导其实就是Makefile的规则。当Makefile需要某一个目标时,他会把这个目标去套规则说明,
	   一旦套上了某个规则说明,则Makefile会试图寻找这个规则中的依赖,如果能找到则会执行这个规则用依
	   赖生成目标。
4、伪目标(.PHONY)
	(1)伪目标意思是这个目标本身不代表一个文件,执行这个目标不是为了得到某个文件或东西,而是单纯为了执
	   行这个目标下面的命令。
	(2)伪目标一般都没有依赖,因为执行伪目标就是为了执行目标下面的命令。既然一定要执行命令了那就不必加
	   依赖,因为不加依赖意思就是无条件执行。
	(3)伪目标可以直接写,不影响使用;但是有时候为了明确声明这个目标是伪目标会在伪目标的前面用.PHONY来
	   明确声明它是伪目标。
5、Makefile中几种变量赋值运算符
	(1)  = 最简单的赋值
	(2)  :=	一般也是赋值
	以上这两个大部分情况下效果是一样的,但是有时候不一样。
	用 = 赋值的变量,在被解析时他的值取决于最后一次赋值时的值,所以你看变量引用的值不能只往前面看,还要
	往后面看。
	用 := 来赋值的,则是就地直接解析,只用往前看即可。
	(3) ?=	如果变量前面并没有赋值过则执行这条赋值,如果前面已经赋值过了则本行被忽略。
	(4) +=  	用来给一个已经赋值的变量接续赋值,意思就是把这次的值加到原来的值的后面,有点类似于strcat。
	(在shell makefile等文件中,可以认为所有变量都是字符串,+=就相当于给字符串stcat接续内容)(注意
	 一个细节,+=续接的内容和原来的内容之间会自动加一个空格隔开)
6、Makefile的环境变量
	(1)makefile中用export导出的就是环境变量。一般情况下要求环境变量名用大写,普通变量名用小写。
	(2)环境变量和普通变量不同,可以这样理解:环境变量类似于整个工程中所有Makefile之间可以共享的全局变
	   量,而普通变量只是当前本Makefile中使用的局部变量。所以要注意:定义了一个环境变量会影响到工程中
	   别的Makefile文件,因此要小心。
	(3)Makefile中可能有一些环境变量可能是makefile本身自己定义的内部的环境变量或者是当前的执行环境提
	   供的环境变量(譬如我们在make执行时给makefile传参。make CC=arm-linux-gcc,其实就是给当前
	   Makefile传了一个环境变量CC,值是arm-linux-gcc。我们在make时给makefile传的环境变量值优先
	   级最高的,可以覆盖makefile中的赋值)。这就好像C语言中编译器预定义的宏__LINE__ __FUNCTION__
	   等一样。
7、Makefile中使用通配符
	(1) *	 若干个任意字符
	(2)	?	1个任意字符
	(3)	[ ]	将[]中的字符依次去和外面的结合匹配
	还有个%,也是通配符,表示任意多个字符,和*很相似,但是%一般只用于规则描述中,又叫做规则通配符。
8、Makefile的自动变量
	(1)为什么使用自动变量。在有些情况下文件集合中文件非常多,描述的时候很麻烦,所以我们Makefile就用一
	   些特殊的符号来替代符合某种条件的文件集,这就形成了自动变量。
	(2)自动变量的含义:预定义的特殊意义的符号。就类似于C语言编译器中预制的那些宏__FILE__一样。
	(3)常见自动变量:
	$@		规则的目标文件名
	$<		规则的依赖文件名
	$^		依赖的文件集合
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值