Shell可以理解为Linux系统的操作命令行界面,是人机交互的一种方式,可以使用shell和操作系统,uboot等软件系统进行交互。
同时Shell也是一种编程语言,可以用于编写Shell脚本程序,在Linux中常用的脚本语言是bash,脚本语言在嵌入式中主要用于做配置的,一个复杂的嵌入式程序都是可配置的,用于适用于各种场景和硬件。
Shell脚本程序是解释运行的,编译器逐行解释语句并执行,每行语句被翻译成二进制数据,在Shell脚本语句被执行的时候调用。
任何文本编辑器都可以用于编写Shell脚本程序,并且不需要使用编译器,编写完毕之后有三种执行脚本程序的方式:
Shell程序编写一般规则如下:
其实Shell就是把命令行中执行的命令写在了程序里,用程序的逻辑执行各种命令的集合,写在文件里而已。
Shell是脚本语言,变量的定义不需要指定类型,没有类型的概念,可以直接定义,例如”APPID=”test”“,变量定义的时候可以初始化,使用=号连接。
变量引用需要使用$符号,这个符号是必须的,不然无法取出变量的值。如果变量没有定义,则取出来的值为空。
双引号范围内,特殊符号可以直接输出,如果没有在双引号,则这些特殊符号包括双引号自身则无法输出,单引号作用类似。
在shell中执行Linux命令有两种方式,直接执行或者是使用反引号括起来执行,使用反引号扩起来执行,可以得到该命令的结果值。
常用的分支判断格式如下:
if[ xxx ];then
xxx
else
xxx
fi
if常用的判断条件有:
除此之外,还可以使用逻辑与&&和逻辑或||结合简写的if表达式进行比较,例如:[ -z $str ] || [echo null ]
。
for循环结构的一般写法如下:
for i in 1 2 3 4 5 6
do
xxx
done
while循环结构的一般写法如下:
while [ 条件 ]
do
xxx
done
case语句写法如下:
case $name in
lucy)
xxx ;;
lilei)
yyy ;;
esac
echo指令可以直接创建文件,并将内容写入到文件当中,例如:
echo abcdefg > a.txt
这句指令也可以向已经存在的文件追加内容,将>修改为>>即可。
shell程序本身也可以在调用的时候传递参数,使用预先定义好的符号取出:
shell中的case语句是不需要break的,只用于循环跳出,所以如果发现case和循环结构结合的时候有break存在,则一定要明白这个break是跳出循环而存在的。
shell中的$#,$n等预置变量的值是可以改变的,需要通过shift指令完成,shift指令调用一下,就会把预置的参数从头删除一个,对应的参数个数变量$#也会发生改变。
Makefile有三个部分组成,目标,依赖,命令,
Makefile具有自动推导规则:
%是Makefile的通配符,代表一个或者多个字母。
Makefile定义和使用变量和Shell脚本非常相似,没有变量类型,直接定义使用,引用的时候使用$加变量名即可引用。
伪目标表示该目标不代表一个文件或者具体结果,执行该目标不是为了得到具体的文件或者结果,而是为了执行该目标下面的过程和步骤。伪目标通常没有依赖的声明,有时候为了明确声明该目标是伪目标,会在目标之前用.PHONY标注,表示明确声明该目标为伪目标。
在Makefile文件中引用其他 Makefile文件,需要使用include命令,和C语言中的include用法类似。
在Makefile中使用#表示行注释,和Shell中的一样。
在命令前添加@表示静默执行,静默执行不会把要执行的命令打印出来。
变量赋值运算符在Makefile中有好几种形式:
使用export可以将普通变量导出为环境变量,环境变量可以在整个Makefile工程项目中共用。
Makefile中已经预先定义了一些环境变量,我们在定义自己的环境变量的时候一定要注意避免与这些预定义的环境变量发生冲突。
自动变量指的是Makefile中预定义的具有特殊意义的符号,一般Makefile中的自动变量都带有$符号,常见的自动变量有: