嵌入式课堂笔记5
1、变量
使用方式:$(变量名)
例:变量obj代替“a.o b.o”
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 := (patsubset模式参数,参数1,参数2)
功能:把参数2中符合模式参数的单词(单词是指参数中被空格隔开的字符串)替换成参数1
返回值:被替换后的参数2
例如:
result := (addsuffix 参数1,参数2)
功能:在参数2中的每个单词加上后缀参数1
返回值:加上后缀的所有单词
例如:
result := $(addsuffix .c, x y)
result的值为“x.c y.c”。
(4)foreach
格式:$(foreach 变量参数,参数1,表达式)
功能:循环取出参数1中的单词赋给变量参数,然后运行表达式
返回值:表达式的运行结果
例如:
a:= x y z
result := $(foreach b, $(a), (call 变量参数,参数…)
功能:循环把参数依次赋给变量参数中的(2)…
返回值:赋值后的变量值
例如:
a:= $(2) $(1)
result := $(call $(a), x y)
result的值为“yx”。
3、Makefile嵌套执行
cd 子目录 && $(MAKE)
或:
$(MAKE) –c子目录
4、Makefile练习
加log功能
5、shell:(脚本:批处理)
(1)、命令解析器,遵循一定的语法将输入的命令加以解释并传给系统(将用户输入的命令解析,调用相应的命令的可执行文件)
(2)、脚本语言
例:一条命令执行四条语句(简单的shell脚本)
命令:可执行文件
简单语法:
(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
$?:获取返回值
(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”
比较两个参数:
(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
将用户输入的数字按倒序的方式输出:
输出1~100内的素数
#!/bin/bashsum=0
for (( i=2; i<=100;i++ ));
do
flag=0
for (( j=2;j<=i/2;j++ ));
do
if [ expr $i % $j
= 0 ]
then
flag=1
break
fi
done
[ KaTeX parse error: Expected 'EOF', got '&' at position 14: flag -eq 0 ] &̲& sum=((sum+i))
done
echo $sum