文章写作周期:4月3日晚上9点左右开始11点结束。整个过程比较顺利...没有被其他奇奇怪怪的内容吸引~
说实话,写脚本这一块属实“业务不精”,一来现如今的工具已经比较方便了,二来自己还是比较懒。
正巧最近再尝试公司的云编译功能,虽然云编译插件自动做了大量的工作,但是最终也只是把产物(apk)拉到本地某文件目录下,因此还是需要我们主动要install。
因此基于这个场景就像写一个脚本可以一键的把拉下的apk安装上。
脚本需要的能力:
接下来咱们就开整!不过...开篇咱也说了“业务不精”,所以Shell还真不会写。那么咱们第一步就是先学一学Shell的语法。
开启语法的了解前,咱们先聊一聊什么是Shell。
首先要明确一下,Shell是通用的概念,用来代指操作系统中的命令解释器(command interpretor)。可以简单的理解成“命令行”。
用过无GUI界面的Linux系统的同学应该都清楚,我们能够和操作系统打交道的方式只能通过输入命令。
而这个承接咱们输入的命令并通知操作系统去执行对应操作的工具就被称之为Shell。
但是通常咱们聊的Shell一般都是Linux下的,因为Linux下的Shell处理能充当命令解释器的作用,还拥有自己的编程语言,因此极具扩展性。咱们的Shell脚本也是依赖了这种编译能力...
当然,Shell的强大远不止如此。更多能力就由大家去探索了~
变量:
Shell中的变量定义有些“蛋疼”...不声明任何类型,上来就是干:name="Shell"
,name就是一个变量。
这里还有一个更“诡异”的规定:=左右不能有空格!这个点坑了我很久,name= "Shell"
,这种声明是错误的!
当我们使用变量的时候,需要加一个$
符。比如我们想要打印上面定义的name
,我们需要这样:echo $name
。
说到了$
,咱们额外说一些内容:``
,$()
,${}
的区别。
它俩``
,$()
属于一类:命令的替换。这里如何理解呢?说白了就是把写在这里内容的结果拿出来(就想咱们调用函数,拿返回值一样)。
因此有些时候,我们可能不是为了执行某些命令,而是为了拿到命令对应的值,因此这种情况下就需要这种方式。
而${}
和咱们日常是类似的,就是用{}的内容来替换这里。
脚本参数的获取:
咱们一般执行在执行命令的时候都会遇到一些参数的输入,对于Shell脚本也是如此。想要拿到用户输入的参数怎么办?
直接这个样子:$1
,这中写法的意思就是拿到第一个参数,没错$2
就是拿到第二个参数...
函数:
函数的定义也是比较神奇,无需主动声明参数和返回值:
function getResult(){ first=$1 second=$2 return $first+$second } 复制代码
这里定义了一个函数,可以看到函数体没有参数和返回值的信息。我们要怎么调用呢?
getResult $1 $2 result=$? echo "$result" 复制代码
这里可能有同学注意到$?这个“奇怪”的调用,它的作用就是拿到上述函数的return。这里也是Shell里“蛋疼”的一点...
运行这个脚本后,效果是这样的:
有了这些基础咱们想要完成咱们需要额脚本就比较简单了。这里我先直接贴代码:
args=$1 curNewApk="" # 这里是apk的目录 for apk in /Users/x/xx/xxx/*; do if [[ $curNewApk == "" ]]; then curNewApk=$apk else # 这里获取当前apk的一个时间(小时+分钟),当然这里仅靠小时和分钟无法准确的确定最新的文件,这里仅是提供一种思路 newApkTime=`stat -f %SB -t %H%m $apk` lastApkTime=`stat -f %SB -t %H%m $curNewApk` if [[ newApkTime > lastApkTime ]]; then # 一个简单的给当前最新的apk赋值 curNewApk=$apk fi fi done echo "最新的apk:$curNewApk" # 这里是获取第一个入参,如果是0进执行uninstall的操作 if [[ $args == "0" ]]; then adb uninstall app.x.xx.xxx fi # 常规的install和启动Activity adb install -r $curNewApk adb shell am start -n x.xx.xxx.MainActivity 复制代码
这样,一个简单的脚本就ok了~它能做的事情:从一个目录下边找到一个最近修改的文件然后执行install,在start对应的Activity。
Shell脚本还挺有意思,的确可以很简单的帮我们做很多重复的工作。
学无止境,学无止境~