文章寫做週期:4月3日晚上9點左右開始11點結束。整個過程比較順利...沒有被其餘奇奇怪怪的內容吸引~shell
說實話,寫腳本這一塊屬實「業務不精」,一來現現在的工具已經比較方便了,二來本身仍是比較懶。編程
正巧最近再嘗試公司的雲編譯功能,雖然雲編譯插件自動作了大量的工做,可是最終也只是把產物(apk)拉到本地某文件目錄下,所以仍是須要咱們主動要install。bash
所以基於這個場景就像寫一個腳本能夠一鍵的把拉下的apk安裝上。app
腳本須要的能力:編程語言
接下來我們就開整!不過...開篇咱也說了「業務不精」,因此Shell還真不會寫。那麼我們第一步就是先學一學Shell的語法。函數
開啓語法的瞭解前,我們先聊一聊什麼是Shell。工具
首先要明確一下,Shell是通用的概念,用來代指操做系統中的命令解釋器(command interpretor)。能夠簡單的理解成「命令行」。ui
用過無GUI界面的Linux系統的同窗應該都清楚,咱們可以和操做系統打交道的方式只能經過輸入命令。spa
而這個承接我們輸入的命令並通知操做系統去執行對應操做的工具就被稱之爲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腳本還挺有意思,的確能夠很簡單的幫咱們作不少重複的工做。
學無止境,學無止境~