uboot基础之shell和makefile

                                        shell篇

一、shell介绍

  1、shell是操作系统的终端命令行,shell可以理解为软件系统提供给用户操的命令行界面,可以说它是人机交互的

        一种方式。

   2、我们可以使用系统本身带的shell和操作系统,uboot等软件系统进行交互。具体就是通过shell提供的命令行设

         置,输入命令来完成人机交互。

   3、上述操作在一般情况下都可以工作的很好但是当我们创建100个名字有规律但是并不同的文件的时候命令行就显

         示出了缺点,我们可能去重复100次命令,但是我们可以通过shell脚本文件的方式来解决这个问题。

    4、常用的shell语言:sh,bash,csh,ksh,perl,python等。

    5、perl和python这种脚本语言常用在网络管理配置等领域。运维人员需要了解这些。

    6、脚本语言一般在嵌入是中应用,主要是用来做配置。(一个复杂的嵌入式程序都是可配置的,配置过程使用脚本

    语言来实现的)

    7、linux下最常用的脚本就是bash,我们学习的也是bash脚本。

    8、shell脚本的运行机制:shell解码器会逐行的解释程序代码,然后一行一行的去运行。每一句对应的二进制代码

        可能都编译好了,我们只是调用已经编译好的代码。

二、动手写一个shell脚本

    1、shell脚本程序时文本格式的,只要是文本编辑器都可以去编辑它。

        编译器 不涉及,因为shell是解释性语言,直接编辑完就可以运行。

    2、shell脚本的运行方法,

        (1)、./xx.sh ,和运行二进制可执行程序方法一样。这样运行shell脚本需要有该文件的执行权限。

        (2)、source xx.sh,source是linux的一个命令,这个命令就是用来执行脚本程序的。

        (3)、bash xx.sh, bash是一个脚本程序解释器,本质上是一个可执行程序。这样执行相当于我们执行了bash

            程序,然后把xx.sh作为argv[1]传给他运行。

        (4)、shell程序的第一行一般都是:#!/bin/sh  这行话以#!开始,后面加一个pathname,这句话的意思

            是shell程序执行时被哪个解释器解释执行。那么这句话的意思就是我们这个shell文件将被当前机器中的/bin

            目录下的sh可执行程序执行。

          

        结果:

三、shell脚本的语法

    1、变量的定义和初始化。shell是弱类型语言(语言中有明确的类型声明则属于强类型语言,否则为弱类型语言),

        shell中变量赋值变量和值都要紧挨着=。

    2、变量的引用$,使用时$后面紧跟着要引用的变量名。如上面的例子。

    3、shell中使用字符串可以不加双引号,直接使用。而且有空格时也可以但是缺点就是不能输出转译字符。

    4、单引号中:完全字面替换(不可包含单引号本身)

    5、双引号中:$加变量名可以去变量的值

                           反引号扔表示命令替换

                           可以用\来使用转译功能   

                  

       结果:

     6、shell中的选择分支结构

        (1)、典型if语言格式

                      

            结果:

            注意:$a加双引号,条件是写在中括号中的,中括号的前后都有一个空格          

        (2)、各种判断条件

                -f filename 判断文件是否存在        -d dirname 判断目录是否存在

                关于数字:-eq相等,-gt大于,-lt小于,-ge大于等于,-le小于等于 

             (eq就是equal,gt就是greater than,lt就是less than,ge就是greater or equal,le就是less or equal)

        (3)、for循环

                         

                结果:

                注意:for循环的括号是两个小括号

        (4)while循环

                          

                结果:

        至此shell就介绍的差不多了,但是我只是浅显的介绍了一些基本的东西,要是
        有兴趣的,可以自行学习
        但是嵌入式开发只是将它当作工具所以可以看懂会改就行了。

                                    Makefile篇       

 一、Makefile基础介绍

    1、Makefile的作用和意义:工程项目中c文件太多管理不方便,因此用Makefile来做项目管理,方便

        编译链接过程 。

    2、uboot和linux kernel本质上都是c语言的项目,都由很多个文件组成,因此都需要通过Makefile来

        管理,所以在分析uboot之前必须对Makefile有所了解。

    3、Makefile的组成:目标、依赖、命令

        (1)、目标就是我们要去make xxx的那个xxx,就是我们想要通过操作生成的文件。

        (2)、依赖就是用来生成目标的原材料

        (3)、命令就是加工方法,所以make xxx的过程其实就是使用命令将依赖加工成目标的过程。

    4、通配符%的使用,代表一个或几个字母。例如%.o就是所有以.o结尾的文件。

    5、自动推导:所谓自动推导其实就是Makefile的规则。当Makefile需要一个目标时,它会把这个目标去套

        规则说明,则Makefile会试图寻找这个规则中的依赖,如果找到则会执行这个规则用依赖生成目标。

    6、Makefile中定义和使用变量,和shell脚本非常相似。相似是说:都没有变量类型,直接定义使用,

        引用变量时用$var。

    7、伪目标(.PHONY)

        (1)、伪目标意思是这个目标本身不代表一个文件,执行这个目标不是为了得到某个文件或东西,而是

        单纯为了执行目标下面的命令。

        (2)、 伪目标一般都没有依赖,不加依赖的意思是无条件执行。 

        (3)、伪目标可以直接写,不影响使用。但有时候为了明确这个目标是伪目标还是在伪目标前加上.PHONY

          以此来声明它是伪目标。

      8、Makefile中引用其他Makefile(include指令)

         (1)、有时候Makefile总体比较复杂会分为好几个子Makefile这时候用include指令来添加子Makefile。

         (2)、Makefile中注释的使用#,和shell一样。

         (3)、命令前加@代表静默执行,即不显示执行过程。

    9、Makefile中几种不同的变量赋值运算符

         (1)、=    最简单的赋值

         (2)、 := 一般情况下也是赋值。

           以上这两个大部分情况是一样的。但是用=赋值被解析的值取决于最后一次复制时的值。而:=赋值

           时就地解析,只用往前看即可。

          (3)、?= 如果变量在前面未经赋值(即未被定义过)则赋值。

          (4)、+= 用来给一个已经赋值的变量继续赋值,新的值会被加在后面。

    注意:Makefile并不要求=前后有空格或者无空格。shell要求=前后必须无空格。

     10、Makefile的环境变量

            (1)、Makefile中用export导出的就是环境变量。一般情况下要求环境变量名用大写,普通变量

              名用小写。

            (2)、环境变量和普通变量不同,可以这样理解:环境变量类似于整个工程中所用Makefile中使用

                的全局变量。而普通变量只是当前Makefile中使用的局部变量。                                       

            (3)、Makefile中可能有一些环境变量可能是makefile本身自己定义的内部的环境变量或者是当前的

                 执行环境提供的环境变量(譬如我们在make执行时给makefile传参。make CC=arm-linux-gcc,

                其实就是给当前Makefile传了一个环境变量CC,值是arm-linux-gcc。我们在make时给makefile

                传的环境变量值优先级最高的,可以覆盖makefile中的赋值)。这就好像C语言中编译器预

                定义的宏__LINE__ __FUNCTION__等一样。

    11、Makefile中使用通配符

                (1)、*          若干个任意字符    

                (2)、?        1个任意字符

                (3)、[]        将[]中的字符依次和外面结合匹配

    12、Makefile的自动变量

                (1)为什么使用自动变量。在有些情况下文件集合中文件非常多,描述的时候很麻烦,所以我们Makefile

                    就用一些特殊的符号来替代符合某种条件的文件集,这就形成了自动变量。

                (2)自动变量的含义:预定义的特殊意义的符号。就类似于C语言编译器中预制的那些宏__FILE__一样。

                (3)常见自动变量:

                    $@ 规则的目标文件名

                    $< 规则的依赖文件名

                    $^ 依赖的文件集合

欢迎各位指出不足之处

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页