shell和Makefile

来源:互联网 发布:mac系统没有了 编辑:程序博客网 时间:2024/06/10 14:17

Shell的介绍

Shell是操作系统的终端命令行,是一类编程语言(叫脚本语言),常用的shell语言有sh、bash、csh、ksh、perl、python。在Linux下常用的脚本语言是bash、sh。Shell脚本的运行机制:解释运行。不像C语言那样,编译链接形成二进制文件才能执行,脚本语言编写好后代码可以直接运行,并没有编译链接过程(可能是逐行解释时已经转换成二进制)。Shell程序是文本格式,只要是文本编辑器都可以支持,在linux下的换行符为\n,而在windows下的换行符为\r\n。

 

Shell运行的三种方法

第一:./xx.sh 和运行二进制可执行程序一样,这样就要求文件有可执行

权限(chmod a+x xx.sh)。

第二:source xx.sh  source是Linux的一个命令,这个命令就是用来执行脚本程序,这样运行不需要脚本具有可执行权限。

第三:bash xx.sh  bash是一个脚本解释器,本质上是一个可执行程序,这样执行相当我们执行了bash程序,然后把xx.sh作为argv[1]传给他与运行。

 

Shell的格式

开头#!bin/sh  这行话以#!开始,后面加上一个pathname,意思就是指定shell程序执行时被哪个解释器执行。(#!bin/sh 或者 #!bin/bash)。Shell的注册符号是#。变量的引用符号$。变量引用的时候可以$var,也可以${var}。这两种的区别是在某些情况下只能用${var}而不能简单的$var。

Shell中的双引号:$加变量名可以去变量的值,反引号表示命令替换。\$表示$的字面值(输出$符号)。

\`表示`的字面值

\"表示"的字面值

\\表示\的字面值

除以上情况之外,在其它字符前面的\无特殊含义,只表示字面值。

有时候我们在shell中调用linux命令是为了得到这个命令的返回值,这是应该用一对反引号来调用执行命令。


Shell的选择分支结构

典型的if格式

If[表达式];then

...

Else

...

Fi

 

If的典型应用

判断文件是否存在。(-f) 注意[]里面前后都有空格,不能省略。

判断目录是否存在。(-d)

判断字符串是否相等。(“str”=“str”)

判断数字是否相等。(-eq 相等)、(大于-gt)、(小于-lt)、(大于等于-ge)、(小于等于-le)

判断字符串是否为空(-z)。

If判断式中使用“-o”表示逻辑或。

逻辑与&&和逻辑或||与if表达式结合。

 

Sell的循环结构

For循环

for i in 1 2 3 45 6

do

      echo $i

done

 

while循环

i=2

j=11

while [ $i -lt $j ]

do

       echo $i

       i=$(($i+2))

done

 

Echo的创建和追加输入文件

shell中可以直接使用echo指令新建一个文件,并且将一些内容传入这个文件。创建文件并输入内容符号就是>。(echo "123456" > a.c)

还可以使用echo指令配合追加符号>>想一个已经存在的文件末尾追加输入内容。

 Echo "8961515" >> a.c

 

Case语句

Shell中的case语句本身没有break语句。Uboot中有些break在case语句中出现,是因为和while结合了,此时的break用于跳出while循环。

Var=1

case $var in

      1) echo "1" ;;

      2) echo "2" ;;

Esac

 

调用shell程序的传参

shell程序内部传参是使用一些特定的符号来表示的,包括:

$#表示调用该shell时传参是个数。($#计数时只考虑真正的传参个数)

$0、$1、$2、....依次表示传参的各个参数。

shell:source a.sh aa bb cc  $# = 3, $0是执行这个shell程序的解析程序的名字,$1是第一个有效参数的值,$2是第2个有效参数的值·····

 

Makefile

1.Makefile的作用和意义

工程项目中C文件太多管理不方便,所以用makefiel来管理项目,方便编译链接。

2.目标、依赖、命令

目标就是make xxx生成的那个xxx文件,就是我们最终要成的东西。

依赖就是用来加工生产的原材料。

命令就是加工方法。Make xxx的过程就是使用命令将依赖文件加工生成目标

的过程。

3.通配符%

%代码一个或者几个字母,%.o就代表的以.o为结尾的文件。

4.makefile变量的定义和使用

shell脚本非常相似。(都没有变量类型,直接定义使用,引用变量时$var)

5.伪目标

伪目标就是这个目标本身不代表一个文件,执行这个目标并不是为了得到摸个文件或者东西,而是单纯为了执行这个目标下面的命令。

伪目标一般都没有依赖文件,就是无条件执行。

伪目标可以直接写,不影响使用,但是有时候为了声明这个目标是 伪目标,会在伪目标前添加.PHONY。

6.makefile中引用其他makefile

  使用makefie指令

7.makefile 的注释也是用#。

8.命令前面@表示静默执行。

  如果只输出执行的内容,就用@静默执行。

9.Makefile几种变量赋值运算

=   最简单的赋值

   :=  也是赋值

=赋值的变量,在被解释时它的值取决于最后一次的赋值

:= 赋值就是直接解释,前面赋值是什么就是什么。

=   表示变量前面如果没有被赋值这这行赋值,如果赋值了则忽略本操作。

+=  用来给一个已经赋值的变量连续赋值,就是把后一次赋值的加载原来值的后面(类似strcat)。  

10.Makefile的环境变量

makefile中用export导出的就是环境变量。一般情况下要求环境变量名用大写,普通变量名用小写。环境变量和普通变量不同,可以这样理解:环境变量类似于整个工程中所有Makefile之间可以共享的全局变量,而普通变量只是当前本Makefile中使用的局部变量。所以要注意:定义了一个环境变量会影响到工程中别的Makefile文件,因此要小心

11. Makefile的自动变量

自动变量的含义:预定义的特殊意义的符号。

$@ 规则的目标文件名

$< 规则的依赖文件名

$^ 依赖的文件集合


1 0