嵌入式课堂笔记5

1、变量
使用方式:$(变量名)
例:变量obj代替“a.o b.o”
嵌入式课堂笔记5_第1张图片
Make工程管理器中变量定义方式
(1)“=”
例:a1的值为a.o

在这里插入图片描述
(2)“:=”
例:a1的值是a.o,a2的值是a.o b.o
在这里插入图片描述
a1的值是b.o,而不是“a.o b.o”:
在这里插入图片描述
即前面的变量不能通过后面的变量来定义。
(3)“+=”
例:a1的值是“a.o b.o”,“+=”可以实现给变量追加值。
在这里插入图片描述
a1的值是“a.o b.o”
在这里插入图片描述
即Makefile的“+=”和C语言中的“+=”相似。
(4)“?=”
例:a1的值是a.o,而不是b.o。在这里插入图片描述
即如果变量a1已经在前面定义过了,那么后面的定义就无效了。
2、函数
(1)wildcard
格式:$(wildcard模式参数)
功能:列出当前目录下所有符合模式参数的文件名
返回值:当前目录下所有符合模式参数的文件名
例如:
result := ( w i l d c a r d ∗ . c ) r e s u l t 的 值 为 当 前 目 录 下 所 有 的 C 文 件 名 。 ( 2 ) p a t s u b s t 格 式 : (wildcard *.c) result的值为当前目录下所有的C文件名。 (2)patsubst 格式: (wildcard.c)resultC2patsubst(patsubset模式参数,参数1,参数2)
功能:把参数2中符合模式参数的单词(单词是指参数中被空格隔开的字符串)替换成参数1
返回值:被替换后的参数2
例如:
result := ( p a t s u b s t r e s u l t 的 值 为 “ x . o y . o ” 。 ( 3 ) a d d s u f f i x 格 式 : (patsubst %.c, %.o, x.c y.c) result的值为“x.o y.o”。 (3)addsuffix 格式: (patsubstresultx.oy.o3addsuffix(addsuffix 参数1,参数2)
功能:在参数2中的每个单词加上后缀参数1
返回值:加上后缀的所有单词
例如:
result := $(addsuffix .c, x y)
result的值为“x.c y.c”。

嵌入式课堂笔记5_第2张图片
(4)foreach
格式:$(foreach 变量参数,参数1,表达式)
功能:循环取出参数1中的单词赋给变量参数,然后运行表达式
返回值:表达式的运行结果
例如:
a:= x y z
result := $(foreach b, $(a), ( b ) . c ) r e s u l t 的 值 为 “ x . c y . c z . c ” 。 注 意 , b 在 这 里 是 一 个 临 时 的 变 量 。 ( 5 ) c a l l 格 式 : (b).c) result的值为“x.c y.c z.c”。 注意,b在这里是一个临时的变量。 (5)call 格式: (b).c)resultx.cy.cz.cb5call(call 变量参数,参数…)
功能:循环把参数依次赋给变量参数中的 ( 1 ) 、 (1)、 (1)(2)…
返回值:赋值后的变量值
例如:
a:= $(2) $(1)
result := $(call $(a), x y)
result的值为“yx”。
嵌入式课堂笔记5_第3张图片
3、Makefile嵌套执行
cd 子目录 && $(MAKE)
或:
$(MAKE) –c子目录
4、Makefile练习
嵌入式课堂笔记5_第4张图片
嵌入式课堂笔记5_第5张图片
在这里插入图片描述
嵌入式课堂笔记5_第6张图片
在这里插入图片描述
在这里插入图片描述
嵌入式课堂笔记5_第7张图片
在这里插入图片描述
嵌入式课堂笔记5_第8张图片
嵌入式课堂笔记5_第9张图片
嵌入式课堂笔记5_第10张图片
加log功能
嵌入式课堂笔记5_第11张图片
在这里插入图片描述
嵌入式课堂笔记5_第12张图片
在这里插入图片描述
嵌入式课堂笔记5_第13张图片
嵌入式课堂笔记5_第14张图片
嵌入式课堂笔记5_第15张图片
在这里插入图片描述
嵌入式课堂笔记5_第16张图片
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
嵌入式课堂笔记5_第17张图片
嵌入式课堂笔记5_第18张图片
嵌入式课堂笔记5_第19张图片
嵌入式课堂笔记5_第20张图片
5、shell:(脚本:批处理)
(1)、命令解析器,遵循一定的语法将输入的命令加以解释并传给系统(将用户输入的命令解析,调用相应的命令的可执行文件)
(2)、脚本语言
例:一条命令执行四条语句(简单的shell脚本)
在这里插入图片描述
嵌入式课堂笔记5_第21张图片
嵌入式课堂笔记5_第22张图片
命令:可执行文件
嵌入式课堂笔记5_第23张图片
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
简单语法:
(1)
在这里插入图片描述
(2)
$#:传入脚本的命令行参数个数
$*:所有命令行参数值,在各个参数值间留有空格
$0:命令本身(shell文件名)
$1:第一个命令行参数
$2:第二个命令行参数
(3)局部变量
在变量首次被复制时加上local关键字可表示一个局部变量, 例S3:
#!/bin/bash
hello=“var1“
echo $hello
function func1 {
local hello=“var2” #local 表示局部变量
echo $hello
}
func1
echo $hello
嵌入式课堂笔记5_第24张图片
$?:获取返回值
(4)if语句
If [expression]
then
#code block
fi
If [expression]
then
#code block
else
#code block
fi
If [expression]
then
#code block
else if [expression]
then
#code block
else
#code block
fi
fi
例:
比较整数a和整数b是否相等:if[ $a = $b ]
比较整数a是否大于整数b:if[ $a –gt $b ]
比较字符串a和b是否相等: if[ $a = $b ]
判断字符串a是否为空:if[ -z $a ]
比较整数变量a是否大于b:if[ $a –gt KaTeX parse error: Expected ‘EOF’, got ‘#’ at position 137: …对当前用户可以执行 例S5: #̲!/bin/sh folde…folder” ] && echo “Can read folder“[−f"
folder“[−f"folder” ] || echo “this is not file”

比较两个参数:
嵌入式课堂笔记5_第25张图片
(4)for语句
for循环与C语言中有所不同,在BASH中for循环的基本结构是:
for var in [list]
do
#code block
done
其中var是循环控制变量, [list]是var需要遍历的一个集合,do/done包含了循环体,相当于c语言中的大括号。另外do和for被写在同一行,必须在do前面加上“;”如: for var in [list];do
S7:
#!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do
echo $day
done
如果列表被包含在一对双引号中,则被认为是一个元素,如S8

#!/bin/bash
for day in "Sun Mon Tue Wed Thu Fri Sat“
do
echo
daydone上面的例子中,在for所在那行变量day是没有加”
daydone上面的例子中,在for所在那行变量day是没有加””符号的,而在循环体内,echo所在行变量day必须加“KaTeX parse error: Expected ‘EOF’, got ‘#’ at position 51: …condition] do #̲code block Done…var” in
contidion1)
;;
contidion1)
;;
*)
default statements;;
esac
S12:
#!/bin/bash
echo “Hit a key, then hit return.“
read Keypress
case “$Keypress” in
[A-Z] ) echo “Uppercase letter”;;
[a-z] ) echo “Lowercase letter”;;
[0-9] ) echo “Digit”;;
*) echo “Punctuation, whitespace, or other”;;
(5)while
语法:
while [condition]
do
#code block
done
将用户输入的数字按倒序的方式输出:
嵌入式课堂笔记5_第26张图片
输出1~100内的素数
嵌入式课堂笔记5_第27张图片

你可能感兴趣的:(嵌入式课堂笔记5)