阅读前提:你应该使用过Linux,了解脚本语言的基础概念“弱类型”以及“变量无须定义即可使用”。
几句话
在Linux中,绝大部分操作是这样一个流程:用户–>Shell–>kernel–>硬件。
既能对用户屏蔽复杂操作,又能对kernel起到一定保护,Shell就是处在这样一个位置上的“壳(Shell)”。
Shell中能够使用到的命令有内建命令与外部命令之分,内建命令即为Shell自身提供的命令,相当于调用当前的Shell进程执行一个函数;而外部命令则效率会更差一些,因为它不但会触发磁盘IO,还需要fork出一个单独的进程,执行完再退出,而它的优点也是显然易见的——你有海量功能强大的外部工具可以调用,所以能够用十分少的代码完成非常多的功能。
而学习Shell最重要的原因,就是将繁琐的工作全都自动化处理。
背景
在MTK平台上,每次更新Modem文件都伴随着一个十分机械化的过程:打patch,编译,最后是将编译生成的文件按一定格式重命名再放置到Android工程的相应目录下并修改相应的构建参数。
这里我们仅讨论重命名的情况,MTK的说明如下图:
可以看到,我们要将/database,/bin两个目录下的7个文件改名为右栏的格式。
比如catcher_filter.bin -> catcher_filter_1_lwg_n.bin
脚本代码
Talk is cheap,show me the code.
我们先上完整代码,其后进行详细讲解:
#!/bin/bash
# Created by Duanze 2015/12/28
# For modem update, to make your hands free :)
function confirmOp(){
read -p $1"[Y/n]:" N
if [ "y"x != ${N}x -a "Y"x != ${N}x -a ""x != ${N}x ]; then
echo "exit program"
exit
fi
}
#if false;then
if [ ! -f Android.mk ]; then
echo " There is no 'Android.mk' !"
exit
fi
#fi
if [ ! $1 ]; then
echo " parameter 1 is null"
exit
fi
if [ ! $2 ]; then
echo " parameter 2 is null"
exit
fi
sourceDir=$1
targetDir=$2
if [ ! -d $1 ];then
echo "dir $1 don't exist"
exit
fi
if</