前言
文章寫作周期:4月3日晚上9點(diǎn)左右開(kāi)始11點(diǎn)結(jié)束。整個(gè)過(guò)程比較順利...沒(méi)有被其他奇奇怪怪的內(nèi)容吸引~
說(shuō)實(shí)話,寫腳本這一塊屬實(shí)“業(yè)務(wù)不精”健爬,一來(lái)現(xiàn)如今的工具已經(jīng)比較方便了佩耳,二來(lái)自己還是比較懶。
正巧最近再嘗試公司的云編譯功能真椿,雖然云編譯插件自動(dòng)做了大量的工作鹃答,但是最終也只是把產(chǎn)物(apk)拉到本地某文件目錄下,因此還是需要我們主動(dòng)要install突硝。
因此基于這個(gè)場(chǎng)景就像寫一個(gè)腳本可以一鍵的把拉下的apk安裝上测摔。
腳本需要的能力:
- 找到某文件路徑下最新的apk
- install這個(gè)apk
- 然后打開(kāi)主Activitiy
正文
接下來(lái)咱們就開(kāi)整!不過(guò)...開(kāi)篇咱也說(shuō)了“業(yè)務(wù)不精”解恰,所以Shell還真不會(huì)寫锋八。那么咱們第一步就是先學(xué)一學(xué)Shell的語(yǔ)法。
一修噪、Shell基礎(chǔ)
開(kāi)啟語(yǔ)法的了解前查库,咱們先聊一聊什么是Shell。
1.1黄琼、什么是Shell
首先要明確一下樊销,Shell是通用的概念,用來(lái)代指操作系統(tǒng)中的命令解釋器(command interpretor)脏款∥唬可以簡(jiǎn)單的理解成“命令行”。
用過(guò)無(wú)GUI界面的Linux系統(tǒng)的同學(xué)應(yīng)該都清楚撤师,我們能夠和操作系統(tǒng)打交道的方式只能通過(guò)輸入命令剂府。
而這個(gè)承接咱們輸入的命令并通知操作系統(tǒng)去執(zhí)行對(duì)應(yīng)操作的工具就被稱之為Shell。
但是通常咱們聊的Shell一般都是Linux下的剃盾,因?yàn)長(zhǎng)inux下的Shell處理能充當(dāng)命令解釋器的作用腺占,還擁有自己的編程語(yǔ)言淤袜,因此極具擴(kuò)展性。咱們的Shell腳本也是依賴了這種編譯能力...
當(dāng)然衰伯,Shell的強(qiáng)大遠(yuǎn)不止如此铡羡。更多能力就由大家去探索了~
1.2、Shell的基礎(chǔ)語(yǔ)法
變量:
Shell中的變量定義有些“蛋疼”...不聲明任何類型意鲸,上來(lái)就是干:name="Shell"
烦周,name就是一個(gè)變量。
這里還有一個(gè)更“詭異”的規(guī)定:=左右不能有空格怎顾!這個(gè)點(diǎn)坑了我很久读慎,name= "Shell"
,這種聲明是錯(cuò)誤的槐雾!
當(dāng)我們使用變量的時(shí)候夭委,需要加一個(gè)$
符。比如我們想要打印上面定義的name
募强,我們需要這樣:echo $name
闰靴。
說(shuō)到了$
,咱們額外說(shuō)一些內(nèi)容:``
,$()
钻注,${}
的區(qū)別蚂且。
它倆``
,$()
屬于一類:命令的替換。這里如何理解呢幅恋?說(shuō)白了就是把寫在這里內(nèi)容的結(jié)果拿出來(lái)(就想咱們調(diào)用函數(shù)杏死,拿返回值一樣)。
因此有些時(shí)候捆交,我們可能不是為了執(zhí)行某些命令淑翼,而是為了拿到命令對(duì)應(yīng)的值,因此這種情況下就需要這種方式品追。
而${}
和咱們?nèi)粘J穷愃频男ǎ褪怯脅}的內(nèi)容來(lái)替換這里。
腳本參數(shù)的獲取:
咱們一般執(zhí)行在執(zhí)行命令的時(shí)候都會(huì)遇到一些參數(shù)的輸入肉瓦,對(duì)于Shell腳本也是如此遭京。想要拿到用戶輸入的參數(shù)怎么辦?
直接這個(gè)樣子:$1
泞莉,這中寫法的意思就是拿到第一個(gè)參數(shù)哪雕,沒(méi)錯(cuò)$2
就是拿到第二個(gè)參數(shù)...
函數(shù):
函數(shù)的定義也是比較神奇,無(wú)需主動(dòng)聲明參數(shù)和返回值:
function getResult(){
first=$1
second=$2
return $first+$second
}
這里定義了一個(gè)函數(shù)鲫趁,可以看到函數(shù)體沒(méi)有參數(shù)和返回值的信息斯嚎。我們要怎么調(diào)用呢?
getResult $1 $2
result=$?
echo "$result"
這里可能有同學(xué)注意到$?這個(gè)“奇怪”的調(diào)用,它的作用就是拿到上述函數(shù)的return堡僻。這里也是Shell里“蛋疼”的一點(diǎn)...
運(yùn)行這個(gè)腳本后糠惫,效果是這樣的:
二、按需寫腳本
有了這些基礎(chǔ)咱們想要完成咱們需要額腳本就比較簡(jiǎn)單了钉疫。這里我先直接貼代碼:
args=$1
curNewApk=""
# 這里是apk的目錄
for apk in /Users/x/xx/xxx/*;
do
if [[ $curNewApk == "" ]]; then
curNewApk=$apk
else
# 這里獲取當(dāng)前apk的一個(gè)時(shí)間(小時(shí)+分鐘)寞钥,當(dāng)然這里僅靠小時(shí)和分鐘無(wú)法準(zhǔn)確的確定最新的文件,這里僅是提供一種思路
newApkTime=`stat -f %SB -t %H%m $apk`
lastApkTime=`stat -f %SB -t %H%m $curNewApk`
if [[ newApkTime > lastApkTime ]]; then
# 一個(gè)簡(jiǎn)單的給當(dāng)前最新的apk賦值
curNewApk=$apk
fi
fi
done
echo "最新的apk:$curNewApk"
# 這里是獲取第一個(gè)入?yún)⒛把。绻?進(jìn)執(zhí)行uninstall的操作
if [[ $args == "0" ]]; then
adb uninstall app.x.xx.xxx
fi
# 常規(guī)的install和啟動(dòng)Activity
adb install -r $curNewApk
adb shell am start -n x.xx.xxx.MainActivity
這樣,一個(gè)簡(jiǎn)單的腳本就ok了~它能做的事情:從一個(gè)目錄下邊找到一個(gè)最近修改的文件然后執(zhí)行install蹄溉,在start對(duì)應(yīng)的Activity咨油。
尾聲
Shell腳本還挺有意思,的確可以很簡(jiǎn)單的幫我們做很多重復(fù)的工作柒爵。
學(xué)無(wú)止境役电,學(xué)無(wú)止境~