Shell 脚本工具汇总

1、删除 .gitignore 排除的文件,例如 build/ .idea/ 等文件

当备份项目源码时,并不需要例如 build 等占用很大磁盘空间的无效文件。当是 git 工程时,可以使用如下命令删除无用文件:

git clean -d -fx [-n(显示删除内容)]

由于 git 工程非常多,写了批量删除的脚本,如下:

#!/bin/bash

CODE_DIR_PATH=''
SHOW_REMOVE_FILE=false
ITERATION_DEGREE=2


while getopts d:nh ops
do
    case ${ops} in
        d)
            CODE_DIR_PATH=${OPTARG}
            ;;
        n)
            SHOW_REMOVE_FILE=true
            ;;
        h)
            echo "help : "
            echo "-d code dir path"
            echo "-n show would remove file"
            echo "-h help"
            exit
            ;;
        *)
            echo "unknow params"
            ;;
    esac

done


if [[ ! -e $CODE_DIR_PATH ]]; then
    echo "error ! resource dir not found"
    exit
fi

array_git_dir=()
index_git_dir=0

function func_search_file()
{
    # echo "func_search_file $1   $2"
    for fileName in ` ls -A $1 `
    do
        if [ -d $1"/"$fileName ] 
        then
            # check git project
            if [[ '.git' = $fileName ]]; then
                # echo $1"/"$fileName
                array_git_dir[index_git_dir++]=$1
                break
            else
                # -ge >=;  -le <=;   -gt >;  -lt <;  -eq ==; -ne !=;
                if [[ $2 -lt $ITERATION_DEGREE && '.' != ${fileName:0:1} ]]; then
                    func_search_file $1"/"$fileName $(($2 + 1))
                fi
            fi
        fi
    done
}

func_search_file $CODE_DIR_PATH 0

# echo ${array_git_dir[@]}

for dir in ${array_git_dir[@]}; do
    echo $dir
    cd $dir
    if [[ 'true' = $SHOW_REMOVE_FILE ]]; then
        git clean -d -fx -n
    else
        git clean -d -fx
    fi
    echo '---done'
done

echo 'end running'  

使用方法如下,其中 「deleteBuild.sh」 为该脚本文件名:

sh deleteBuild.sh -d /Users/ionesmile/Documents/iOnesmileDocs/WorkSpace/

# 使用 -n 查看将要删除的文件,例如
sh deleteBuild.sh -d /Users/ionesmile/Documents/iOnesmileDocs/WorkSpace/ -n

# 使用 -h 帮助
sh deleteBuild.sh -h

编写以上脚本,查询的资料和总结点:

2、一键打包 AAR,并打包运行 Demo

#!/bin/bash

basedir=`cd $(dirname $0); pwd -P`
# echo "START: basedir = $basedir"

GeneProject=/Users/ionesmile/Desktop/Package/FmxosGene
DemoProject=/Users/ionesmile/Desktop/Package/FmxosAAR

versionCode='1'
mVersionName='“1.0.0”'

# 打开 gradle 文件,修改版本配置等
# vim $GeneProject/FmxosPlatform/build.gradle

function logi(){
    echo "#########################################################
    echo "##"
    echo "##   "$*
    echo "##"
    echo "#########################################################
}

function die(){
    echo
    echo "$*"
    echo
    exit 1
}

# 更新版本名称,两个参数。要求辅助输入版本,回车表示不变
# $1:build.gradle 文件路径
# $2:版本号,可选,如果为空时,弹出输入提示
function update_version_name(){
    current_version_name=`grep -o 'versionName *["_a-zA-Z0-9.]*' $1 |sed -n '1p'`
    if [[ -z "$2" ]]; then
        read -p "current $current_version_name, please input: " answer
    else
        answer="$2"
    fi

    if [[ -z "$answer" ]]; then
        echo "answer is empty! continue..."
        # 贪婪匹配最后一个空格并截取
        mVersionName=${current_version_name##* }
    else
        # 版本名,添加双引号
        if [[ ${answer:0:1} != '"' ]]; then
            answer="\"$answer\""
        fi
        mVersionName=$answer
        sed -i '' "s/$current_version_name/versionName $answer/g" $1
        echo "changed: $current_version_name ---> versionName $answer"
    fi
}

function update_version_code(){
    current_version_code=`grep -o 'versionCode *[0-9]*' $1 |sed -n '1p'`
    if [[ -z "$2" ]]; then
        read -p "current $current_version_code, please input: " answer
    else
        answer="$2"
    fi

    if [[ -z "$answer" ]]; then
        echo "answer is empty! continue..."
        # 贪婪匹配最后一个空格并截取
        versionCode=${current_version_code##* }
    else
        versionCode=$answer
        sed -i '' "s/$current_version_code/versionCode $answer/g" $1
        echo "changed: $current_version_code ---> versionCode $answer"
    fi
}

# 更新版本名和版本号,第一个为主版本号,之后为辅助版本号同第一个更新
function update_version(){
    if [[ ! -f $1 ]]; then
        die "GeneProject build.gradle file not exist. -> $1"
    fi
    if [[ ! -f $2 ]]; then
        die "DemoProject build.gradle file not exist. -> $2"
    fi
    update_version_name $1
    update_version_name $2 $mVersionName
    update_version_code $1
    update_version_code $2 $versionCode
}

update_version $GeneProject/FmxosPlatform/build.gradle $DemoProject/app/build.gradle


##########################################################
## 合成代码到单个工程,并生成 AAR,最后打包测试Demo
##########################################################


start_time=$(date +%s)

function gene_aar(){
    # 调用 java,执行合成代码功能
    java -jar $basedir/MergeModule_jar/MergeModule.jar

    # 调用生成 AAR 文件
    cd $GeneProject
    ./gradlew clean
    logi "GeneProject clean done.   "$(($(date +%s)-start_time))"s"
    ./gradlew :FmxosPlatform:assembleRelease
    logi "GeneProject assemble done.   "$(($(date +%s)-start_time))"s"

    # 将 AAR 文件复制到 Demo 中
    cp FmxosPlatform/build/outputs/aar/FmxosPlatform-release.aar $DemoProject/FmxosPlatform/FmxosPlatform-release.aar
    # open FmxosPlatform/build/outputs/aar/
}

function package_demo(){
    # 调用打包测试APK
    cd $DemoProject
    ./gradlew clean
    logi "AARProject clean done.   "$(($(date +%s)-start_time))"s"
    ./gradlew assembleRelease
    logi "AARProject assemble done.   "$(($(date +%s)-start_time))"s"

    # 调用打开 APK 目录
    open app/build/outputs/apk/release/

    # 调用自动安装 apk 到手机
    apkName=$(ls app/build/outputs/apk/release/ | grep '.apk' | sed -n '1p')
    adb install -r app/build/outputs/apk/release/$apkName
    adb shell am start -n com.fmxos.fmxosaar/.MainActivity
}

gene_aar

package_demo

logi 'END... time:'$(($(date +%s)-start_time))"s"

知识点总结:

  1. 获取当前 shell 脚本文件的目录,执行相对路径下的 jar 文件
  2. 使用 grep 命令,查找 versionName,并使用字符串截取值
  3. 使用 sed 命令,修改 versionName 的值
  4. 调用 java -jar 执行 jar 文件,使用 IDEA 导出 jar
  5. 调用 gradlew 打包指定模块的 Release 版本
  6. cp 命令复制文件,open 打卡文件夹
  7. 使用 $(date +%s) 计算命令执行时间差

发表评论

电子邮件地址不会被公开。 必填项已用*标注