shell脚本:拷贝android源码下所有的Android.mk到特定目录

最近由于想研究下android的编译系统,需要查看android源码中build目录下的脚本,这些脚本和各个模块中的Android.mk可能会产生关联,在构建source insight工程的时候,我希望把所有build目录的的源码和所有的Android.mk放到一起,构建一个工程,方便研究。那么怎么提取出所有的Android.mk文件呢?这涉及到shell编程了。

整个实现过程非常简单,只有几行代码,但由于之前没写过shell脚本,整个过程还是很有乐趣的,所以把它分享出来,大神请绕道。

脚本如下:

#!/bin/bash
FILES=$(find -name Android.mk)
for file in ${FILES}
do	
	echo ${file} > tem.txt
	local_file=$(sed -e 's/\.\///g' -e 's/Android.mk//g' tem.txt)
	echo ${local_file}
	mkdir -p ~/makefile/${local_file}
	cp ${file} ~/makefile/${local_file}
done
if [ -f tem.txt ];then
	rm tem.txt
fi

把这个脚本放到android源码目录下,执行该脚本,就会在用户目录下生成makefile目录,里面就是所有的Android.mk文件了,而且他们的目录与之前所在的目录相同。

这段脚本解析:

首先使用find命令找到所有的Android.mk,FILES中保存的是一个个./XXX/XX/Android.mk 的条目,把这些条目的每一个取出来,放到file变量中,使用echo把这个条目写入到tem.txt文件中,方便sed命令使用。然后使用sed命令去除 ./ 和结尾的Android.mk

,得到XXX/XX/ ,并把这个值赋给local_file变量,然后mkdir命令在用户目录下的makefile文件中创建该路径标识的目录,最后把Android.mk拷贝到该目录下去。

如果是新手,可以把它看完。在写这个脚本的时候,我总结了一下几点shell编程的知识:

1.赋值语句

等号“=”前后不可以有空格。

2.$() `` ${}

前两个符号的作用都是引用shell命令并将执行的结果替换到所在的位置。${}用于变量替换。

3.for 循环

for var in list

do

...

done

shell中的for循环会从list中依次取值,赋给var变量。比如

for lvar in a b c d

do 

echo ${lvar}

done

会打印:

a

c

d

4.sed的替换命令

这个脚本中使用echo 把find到的一个条目存储到tem.txt文件中,然后使用sed命令去掉开头的"./"和结尾的Android.mk,最后只得到路劲。

sed 使用 ‘s/.../.../ ’的格式来标示替换。

可以在末尾加g,标识替换每一个匹配的关键字,否则只替换每行的第一个。这里加不加g都可以。

sed中使用的转义字符是:'\' ,. 和/都需要转义

4.1替换特定的行

sed 'n,ms/dog/cat/g' file  ##n、m为数字

4.2 sed中的 ^,$

上箭头”^”表示行首,美元”$”符号如果在引号中表示行尾,但是在引号外却表示末行(最后一行)。

另外,这里的-e 标示执行sed命令,一行中可以使用多个-e执行多个命令。

sed是一个很强大的命令,建议大家专门学习下。

5.if

if 条件;then

...

fi

一定要注意条件后面有个“;”.

条件的格式也要注意,[  ]里面前后各有一个空格。

总结一下:

虽然这段脚本非常简单,但是通过使用这段脚本,真心体会到了脚本带来的巨大的方便。


你可能感兴趣的:(编程,shell)