美文网首页
Shell命令解惑

Shell命令解惑

作者: AKyS佐毅 | 来源:发表于2021-02-20 10:12 被阅读0次

将Flutter Module作为私有库使用的脚本如下

path="../iOS_Flutter_Framework/FlutterLibrary/Frameworks"
libPath="../iOS_Flutter_Framework"
currentDate=$(date "+%Y%m%d%H%M%S")
pre_version=${Build_pre_version}
libTag="${pre_version}.${currentDate}"
echo "$libTag"

#判断输入的Tag_Version 不为空
if [ -z $libTag ];then
    #输入的是空
    echo "\n输入格式错误,请重新运行脚本,输入正确格式的sdk tag版本号\n"
else
    #不是空
    # release的正则
    reg='^[0-9]{1,4}\.[0-9]{1,4}\.[0-9]{1,14}$'

    echo "Tag_Version》》》》》》 "$libTag

    if [[ "$libTag" =~ $reg ]];then
        echo "恭喜你,输入的版本号,格式验证通过"
    else
        echo "\n输入格式错误,请重新运行脚本,输入正确格式的sdk tag版本号\n"
        exit 1
    fi
fi

rm -rf $path
mkdir $path
out=$path
outLib=$libPath
echo "准备输出所有文件到目录:$out"

echo "清除所有已编译文件"

find . -d -name build | xargs rm -rf

flutter clean

rm -rf build

flutter pub get

addFlag(){
    cat .ios/Podfile > tmp1.txt
    echo "use_frameworks!" >> tmp2.txt
    cat tmp1.txt >> tmp2.txt
    cat tmp2.txt > .ios/Podfile
    rm tmp1.txt tmp2.txt
}

echo "检查 .ios/Podfile文件状态"
a=$(cat .ios/Podfile)
if [[ $a == use* ]]; then
    echo '已经添加use_frameworks, 不再添加'
else
    echo '未添加use_frameworks,准备添加'
    addFlag
    echo "添加use_frameworks 完成"
fi

echo "编译flutter"

BuildMode=${BuildType}

if [ ${BuildMode} = "Debug" ]; then
  flutter build ios --debug --no-codesign  
else
  flutter build ios --release --no-codesign  
fi

echo "编译flutter完成"

if [ ${BuildMode} = "Debug" ]; then
 cp -r build/ios/Debug-iphoneos/*/*.framework $out
 cp -r build/ios/Debug-iphoneos/App.framework $out
 cp -r build/ios/Debug-iphoneos/Flutter.framework $out
else
  cp -r build/ios/Release-iphoneos/*/*.framework $out
  cp -r build/ios/Release-iphoneos/App.framework $out
  cp -r build/ios/Release-iphoneos/Flutter.framework $out
fi

echo "复制framework库到文件夹: $out"

cd  $outLib

sh ./auto.sh $libTag

#! /bin/sh

# 只需要修改这个内容就行,其他的内容不需要改动
git_commit_des="update framework"

echo "\n ****** begin ****** \n"

echo "\n ---- 获取podspec文件 begin ---- \n"

tag_version=$1
echo "tag_version 是 $1"

# 获取到的文件路径
file_path=""
file_name=""
# 文件后缀名
file_extension="podspec"
# 文件夹路径,pwd表示当前文件夹
directory="$(pwd)"


# 参数1: 路径;参数2: 文件后缀名
function getFileAtDirectory(){
    for element in `ls $1`
    do
        dir_or_file=$1"/"$element
        # echo "$dir_or_file"
        if [ -d $dir_or_file ]
        then
            getFileAtDirectory $dir_or_file
        else
            file_extension=${dir_or_file##*.}
            if [[ $file_extension == $2 ]]; then
                echo "$dir_or_file 是 $2 文件"
                file_path=$dir_or_file
                file_name=$element
            fi
        fi
    done
}
getFileAtDirectory $directory $file_extension

echo "\n -------------"
echo "\n file_path: ${file_path}"
echo "\n file_name: ${file_name}"
echo "\n ---- 获取podspec文件 end ---- \n"

# 定义pod文件名称
pod_file_name=${file_name}
# 查找 podspec 的版本
search_str="s.version"

# 读取podspec的版本
podspec_version=$tag_version

podspec_prev_version=""

function changeSpecVersion() {
    echo ${pod_file_name}
    while read line
    do
        zhengze="^s.version"
        if [[ "$line" =~ $zhengze ]];then
            echo "File:${line}"
            sed -i "" "s/${line}/s.version      = \"$tag_version\"/g" $file_path
        fi
    done < $file_path
#    cat  $pod_file_name
}

echo "\n ---- 读取原始podspec文件内容 start ---- \n"
#定义了要读取文件的路径
my_file="${pod_file_name}"
while read my_line
do
#输出读到的每一行的结果
# echo $my_line

    # 查找到包含的内容,正则表达式获取以 ${search_str} 开头的内容
    result=$(echo ${my_line} | grep "^${search_str}")
    if [[ "$result" != "" ]]
    then
           echo "\n ${my_line} 包含 ${search_str}"

           # 分割字符串,是变量名称,不是变量的值; 前面的空格表示分割的字符,后面的空格不可省略
        array=(${result// / })
        # 数组长度
        count=${#array[@]}
        # 获取最后一个元素内容
        version=${array[count - 1]}
        # 去掉 '
        version=${version//\'/}

        podspec_prev_version=$version
    #else
           # echo "\n ${my_line} 不包含 ${search_str}"
    fi

done < $my_file
echo "\n ---- 读取原始podspec文件内容 end ---- \n"
echo "\n podspec_prev_version: ${podspec_prev_version}"
echo "\n ---- 修改podspec文件内容 start ---- \n"
changeSpecVersion
echo "\n ---- 修改podspec文件内容 end ---- \n"

pod_spec_name=${file_name}
pod_spec_version=${podspec_version}

echo "\n****** ${pod_spec_name} ${pod_spec_version} begin ****** \n"

echo "\n ------ 执行 pod install ------ \n"

echo "cd Example"
cd Example
echo "pod install"
pod install

# 回到上级目录
echo "cd .."
cd ..

echo "\n ------ 执行 git 本地提交代码操作 ------ \n"
# git 操作
echo "git add ."
git add .
echo "git status"
git status
echo "git commit -m ${git_commit_des}"
git commit -m 'update framework'
git pull origin master
git push -u origin master

echo "\n ------ 执行 pod 本地校验 ------ \n"
# pod 本地校验
echo "pod lib lint --allow-warnings --verbose"
pod lib lint --allow-warnings --verbose


echo "\n ------ 执行 git 打标签tag,并推送到远端 ------ \n"
# git推送到远端
echo "git tag ${pod_spec_version}"
git tag ${pod_spec_version}
echo "git push origin master --tags"
git push origin master --tags


echo "\n ------ 执行 pod 远端校验 ------ \n"
# pod 远端校验
echo "pod spec lint --allow-warnings --verbose"
pod spec lint --allow-warnings --verbose

echo "\n ------ 执行 pod 发布 ------ \n"
# 发布
echo "pod repo push --allow-warnings"
#pod trunk push --allow-warnings
pod spec lint --sources="https://github.com/CocoaPods/Specs.git,http://gitlab.xxx.com/App/iOS/PrivateCocoapodsSpec" --use-libraries --allow-warnings

pod repo push PrivateCocoapodsSpec  $file_name --allow-warnings

echo "\n****** ${pod_spec_name} ${pod_spec_version} end ****** \n"

echo "****** end ******"

容易混淆巩固

#!/bin/bash
#

#1.反引号与$()用于命令替换
echo `date '--date=1 hour ago' +%Y-%m-%d-%H`
#或者
echo $(date '--date=1 hour ago' +%Y-%m-%d-%H)

#在编写Shell脚本时建议使用$(),原因主要有:
 #(1)反引号与单引号外形相似,容易混淆;
 #(2)在多层次的复合替换中,里层的反引号需要转义处理(\`) ,而$()则比较直观。例如下面的命令格式是错的:
 # (3)反引号中对于反斜杠有特殊的处理,使用反协议对Shell特殊字符进行转义时需要两个反斜杠,而$()中只需要使用一个反斜杠。
 #比如下面的脚本,需要输出$HOME,而不是环境变量HOME的内容,在反引号中需要对$符使用双反斜杠进行转义,$()中只需要使用一个反斜杠。
  
var1=`echo \$HOME`      #使用一个反斜杠无法完成对$符的转义
var2=`echo \\$HOME`
var3=$(echo \$HOME)
echo $var1
echo $var2
echo $var3

#2.1直接变量替换
A="dablelv"
echo ${A}B

#2.2特殊变量替换
file="/dir1/dir2/dir3/my.file.txt"
echo ${file:1}

variable="'(]\\{}\$\""
echo "${variable}"
echo $variable  

num=1
echo "hello world,$num"
echo 'hello world,$num'
echo hello world,$num

echo $(date) 
name="str.tar.gz"
echo ${name} 


name11='runoob'
str1="Hello, I know you are \"$name11\"!"
str2="Hello, I know you are "$name11"!"
str3='Hello, I know you are \"$name11\"!'
str4="Hello, I know you are \'$name11\'!"   
#str5='Hello, I know you are \'$name11\'!'  错误的
echo $str1
echo $str2
echo $str3
echo $str4

:<<!
'(]\{}$"
'(]\{}$"
hello world,1
hello world,$num
hello world,1
Hello, I know you are "runoob"!
Hello, I know you are runoob!
Hello, I know you are \"$name11\"!
Hello, I know you are \'runoob\'!
!

可以参考,将私有库自动化
https://github.com/casatwy/ConfigPrivatePod

Shell 手把手教你入门
链接: https://pan.baidu.com/s/17SjZYjWxpDQqMeY8wjXsOg 密码: kg4n

推荐博客:
https://github.com/dunwu/blog/blob/master/source/_posts/coding/shell.md

相关文章

  • Shell命令解惑

    将Flutter Module作为私有库使用的脚本如下 容易混淆巩固 可以参考,将私有库自动化https://gi...

  • vim学习 09——shell命令

    vim学习 09——shell命令 执行 shell 命令 :!shell命令 : 可以执行 shell 命令。 ...

  • ADB常用命令集合

    基础命令 USB设备命令 文件传输命令 SHELL命令 adb shell pm命令 adb shell am命令...

  • (linux/mac)mysql调用系统命令

    system + shell命令! + shell命令

  • shell脚本基础

    shell介绍 shell命令: 在linux终端能被解析的命令,就是shell命令。 shell脚本: 多个sh...

  • adb shell logcat 命令

    adb shell logcat 命令 Tags: adb_shell adb shell logcat命令映射为...

  • exec命令

    shell 中的 exec 两种用法: 1.exec 命令 ;命令代替shell程序,命令退出,shell 退出;...

  • shell 命令

    Linux shell执行命令有三种: 内建命令, shell函数和外部命令 内部命令: shell程序本身包含的...

  • shell中的内建命令, 函数和外部命令

    Shell识别三种基本命令:内建命令、Shell函数以及外部命令:(1)内建命令就是由Shell本身所执行的命令。...

  • Linux——常用Shell命令

    Shell 命令格式: commandoptions [argument] command:Shell 命令名称...

网友评论

      本文标题:Shell命令解惑

      本文链接:https://www.haomeiwen.com/subject/bujtfltx.html