Shell和Makefile

Shell

Shell可以理解为Linux系统的操作命令行界面,是人机交互的一种方式,可以使用shell和操作系统,uboot等软件系统进行交互。

同时Shell也是一种编程语言,可以用于编写Shell脚本程序,在Linux中常用的脚本语言是bash,脚本语言在嵌入式中主要用于做配置的,一个复杂的嵌入式程序都是可配置的,用于适用于各种场景和硬件。

Shell脚本程序是解释运行的,编译器逐行解释语句并执行,每行语句被翻译成二进制数据,在Shell脚本语句被执行的时候调用。

Shell脚本程序编写

任何文本编辑器都可以用于编写Shell脚本程序,并且不需要使用编译器,编写完毕之后有三种执行脚本程序的方式:

  • 直接运行脚本文件名称
  • 使用source命令执行,不需要脚本有可执行权限
  • 使用bash命令执行

Shell程序编写一般规则如下:

  • 第一行一般都是“#!/bin/bash”,其中/bin/bash是路径,表示要使用什么解释器执行该脚本
  • Shell脚本使用#作为行注释
  • 正文其实就是常用的命令。

其实Shell就是把命令行中执行的命令写在了程序里,用程序的逻辑执行各种命令的集合,写在文件里而已。

Shell编程

变量

Shell是脚本语言,变量的定义不需要指定类型,没有类型的概念,可以直接定义,例如”APPID=”test”“,变量定义的时候可以初始化,使用=号连接。

变量引用需要使用$符号,这个符号是必须的,不然无法取出变量的值。如果变量没有定义,则取出来的值为空。

符号

双引号范围内,特殊符号可以直接输出,如果没有在双引号,则这些特殊符号包括双引号自身则无法输出,单引号作用类似。

执行Linux命令

在shell中执行Linux命令有两种方式,直接执行或者是使用反引号括起来执行,使用反引号扩起来执行,可以得到该命令的结果值。

分支判断

常用的分支判断格式如下:

if[ xxx ];then
    xxx
else
    xxx
fi

if常用的判断条件有:

  • -f:判断文件是否存在
  • -d:判断 目录是否存在
  • =号判断字符串是否 相等,字符串两边需要加引号
  • -eq判断数字是否相等
  • -gt判断是否大于,-lg判断是否小于,-ge判断大于等于
  • -z判断字符串是否为空
  • -o表示逻辑或

除此之外,还可以使用逻辑与&&和逻辑或||结合简写的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语句写法如下:

case $name in 
    lucy)
    xxx ;;
    lilei)
    yyy ;;
esac

echo创建和追加输入文件

echo指令可以直接创建文件,并将内容写入到文件当中,例如:

echo abcdefg > a.txt

这句指令也可以向已经存在的文件追加内容,将>修改为>>即可。

shell程序传参

shell程序本身也可以在调用的时候传递参数,使用预先定义好的符号取出:

  • $#表示传递参数的个数
  • $0,$1,$2,$n表示按照索引获取传递的参数值
  • 需要注意的是$0是该Shell程序的解释器名称,有效参数是从$1开始的。

break关键字和shift关键字

shell中的case语句是不需要break的,只用于循环跳出,所以如果发现case和循环结构结合的时候有break存在,则一定要明白这个break是跳出循环而存在的。

shell中的$#,$n等预置变量的值是可以改变的,需要通过shift指令完成,shift指令调用一下,就会把预置的参数从头删除一个,对应的参数个数变量$#也会发生改变。

Makefile

Makefile有三个部分组成,目标,依赖,命令,

  • 目标就是要生成的结果
  • 依赖是用于生成目标的原材料或者源代码
  • 命令就是将依赖加工成目标的方法

自动推导规则和通配符

Makefile具有自动推导规则:

  • 文件中的第一个目标是默认目标,使用make即可执行
  • 当Makefile需要一个目标时,会检查目标所需要的依赖是否完整,如果不完整则会将其作为目标进行创建,依次类推直到最终的目标所需要的依赖是完整的

%是Makefile的通配符,代表一个或者多个字母。

变量

Makefile定义和使用变量和Shell脚本非常相似,没有变量类型,直接定义使用,引用的时候使用$加变量名即可引用。

伪目标

伪目标表示该目标不代表一个文件或者具体结果,执行该目标不是为了得到具体的文件或者结果,而是为了执行该目标下面的过程和步骤。伪目标通常没有依赖的声明,有时候为了明确声明该目标是伪目标,会在目标之前用.PHONY标注,表示明确声明该目标为伪目标。

引用其他Makefile文件

在Makefile文件中引用其他 Makefile文件,需要使用include命令,和C语言中的include用法类似。

MakeFile基本使用

注释

在Makefile中使用#表示行注释,和Shell中的一样。

静默执行

在命令前添加@表示静默执行,静默执行不会把要执行的命令打印出来。

变量赋值运算符

变量赋值运算符在Makefile中有好几种形式:

  • ?=:表示如果在之前该变量没有被赋值过,则该变量会被赋值。需要注意的是,变量一旦被定义,就相当于赋值过
  • +=:表示给一个已经赋值的变量接续赋值,把要赋值的内容接在原变量值的后面,新值和原来的值之间会自动添加空格,需要知道。
  • =:直接赋值运算符,
  • :=:和=不同的是,会马上将将赋值的内容所引用的内容直接解析,即便后期将引用内容的值改变了,该值还是不会变。

环境变量

使用export可以将普通变量导出为环境变量,环境变量可以在整个Makefile工程项目中共用。

Makefile中已经预先定义了一些环境变量,我们在定义自己的环境变量的时候一定要注意避免与这些预定义的环境变量发生冲突。

通配符

  • *号匹配一个或者多个任意字符
  • ?匹配任意单个字符
  • []指的是匹配中括号中的任意字符,只能匹配其中的一个字符
  • %匹配任意多个字符,一般用于规则描述中

自动变量

自动变量指的是Makefile中预定义的具有特殊意义的符号,一般Makefile中的自动变量都带有$符号,常见的自动变量有:

  • $@:规则的目标文件名
  • $<:规则依赖的第一个文件的文件名
  • $^:规则依赖的文件集合

你可能感兴趣的:(uboot)