Shell脚本实战(一)

1、前言

Shell脚本的语法规则不复杂,在Linux系统很重要,一些操作可以整合成一个shell脚本,节省时间,本文不去讲述shell的语法规则,相关的资料网上很多,只需要多使用即可,此处记录在实际工作中用到shell脚本,积累一些常用的用法,后续也可以参考。

2、功能点

因为项目原因,c++代码体系非常庞大,初次搭建开发调试操作比较繁琐,初次编译时间也很长,所以将操作整合成一个shell脚本,当前shell脚本主要涉及到的操作如下:

  • 获取当前脚本所在目录
  • 循环读取输入数据,不满足条件时提示
  • 判断文件夹是否存在
  • 判断输入是否为空
  • shell脚本内执行外部脚本
  • 检测git是否安装、安装git、clone代码、pull代码
  • 判断网络环境是否联通
  • 判断端口是否被占用
  • 替换文件中特定字符
  • 在shell脚本中,后台运行其他外部脚本,不阻塞当前脚本执行
  • echo输出有颜色的字符

3、实际的脚本

#!/bin/bash

function cppAutoBuild(){
    echo ========================================
    echo 自动化处理c++编译环境脚本启动
    echo ========================================

    #获取当前脚本所在的目录
    currentDir=$(cd $(dirname $0); pwd)

    read -p "请输入用于保存代码的文件夹名称:" workSpace
    while [ -z $workSpace ]
        do
        read -p "文件夹名称为空,请重新输入:" workSpace
    done

    #判断文件夹是否已经存在
    if [ ! -d $workSpace ]
    then 
        mkdir $workSpace
        echo "文件夹创建成功!文件夹名称为:${workSpace}"
    fi

    #切进工作目录
    cd ${currentDir}/${workSpace}

    #判断是否已经存在cloud的文件夹
    if [ -d "cloud" ]
    then 
        read -p "文件夹${workSpace}里面存在cloud文件夹,是否删除后重新clone,输入y表示删除,其他则不删除:" isDelete
        if [ ${isDelete} = "y" ]
        then
            rm -rf ./cloud
        fi    
    fi

    #检测是否安装git
    funCheckGit

    #如果cloud还在,则pull,不存在则clone
    if [ -d "cloud" ]
    then
        echo "已经存在cloud文件,不再重新拉取代码!"
    else
        #设置git地址和分支名称
        read -p "请输入Git地址,不输入则使用默认地址(http://192.168.51.54:7990/scm/cloud/cloud.git):" url
        if [ -z $url ]
        then
            url='http://192.168.51.54:7990/scm/CADcloud/cloud.git'
            echo "未输入Git地址,使用默认地址:${url}"
        fi
        read -p "请输入要拉取的分支名称,不输入则使用默认分支(develop):" branch
        if [ -z $branch ]
        then 
            branch="develop"
            echo "未输入分支名称,使用默认分支:${branch}"
        fi
        funGitClone $branch $url
    fi

    #执行拉取的文件夹下的脚本(执行两遍)
    chmod u+x ./cloud/CMakeBuild/Linux/x86_64/CADE3_lnxx86_64Dbg.sh
    sh ./cloud/CMakeBuild/Linux/x86_64/CADE3_lnxx86_64Dbg.sh
    sh ./cloud/CMakeBuild/Linux/x86_64/CADE3_lnxx86_64Dbg.sh
    echo "脚本执行完成!"

    #执行c++编译脚本
    cd ./cloud/CMakePlatforms/CADE3_lnxX64Dbg
    echo "开始编译c++代码......"
    make -j6
    echo "代码编译完成!"

    #复制部分需要的文件夹
    outBinFolder=${currentDir}/${workSpace}/cloud/Out/Debug/Linux/x86_64/Bin
    if [ ! -d "${outBinFolder}/fonts" ]
    then 
        echo "开始复制所需文件夹......"
        cd ${currentDir}/${workSpace}/cloud/Thirdparty/
        cp -r ./webcad_deps/* ${outBinFolder}
    fi
    if [ ! -d "${outBinFolder}/zh-CN" ]
    then
        cd ${currentDir}
        if [ -d "${currentDir}/zh-CN" ]
        then
            cp -r ./zh-CN ${outBinFolder}
        else
            echo -e "\e[33m 被复制的文件夹${currentDir}/zh-CN不存在,跳过此步骤!\e[0m"
        fi
    fi
    echo -e "\e[32m 自动化脚本执行完成!!! \e[0m"
}

#检测是否安装git
function funCheckGit(){
    if ! [ -x "$(command -v git)" ]
    then
        echo '当前服务器未安装git,尝试自动安装!'
        ping -c 4 "www.baidu.com"
        if [ $? -eq 0 ]
        then
            echo "开始安装Git......"
            apt -get install -y git
            echo "Git安装成功!"
        else
            echo "当前服务器无法连接网络,请自行安装Git,程序退出!"
            exit 1
        fi
    fi
}

#clone代码
function funGitClone(){
    result=$(git clone -b $1 $2)
    if [ $? -ne 0 ]
    then
        echo $result
        exit 1
    else
        echo "代码clone成功!"
    fi
}

#pull代码
function funGitPull(){
    result=$(git pull origin $1)
    if [ $? -ne 0 ]
    then
        echo $result
        exit 1
    else
        echo "代码pull成功!"
    fi
}

#安装code-service
function configCodeServer(){
    echo ========================================
    echo 自动安装配置code-server
    echo ========================================

    if [ -f codeServer.zip ]
    then 
        mkdir codeServer
        unzip -d ./codeServer codeServer.zip
        cd codeServer
        tar -xzvf code-server-4.4.0-linux-amd64.tar.gz

        while :
        do
            read -p "设置code-server的端口号:" port
            while [ -z $port ]
                do 
                read -p "端口号不能为空,请设置code-server的端口号:" port
            done
            info=`lsof -i:${port}|grep -v "PID"`
            if [ "${info}" != "" ]
            then
                echo "端口${port}被占用,请重新输入!"
            else
                break
            fi
        done

        #替换脚本文件中的端口号
        sed -i "s/9999/${port}/g" runCodeServer.sh

        #启动code-service
        nohup sh ./runCodeServer.sh >/dev/null 2>&1 &
        echo -e "\e[33m code-server启动成功,端口为${port} \e[0m"
        
        #退回到脚本所在目录
        cd ..
    else
        echo 'codeServer压缩包不存在,程序退出!'
    fi
}

read -p "是否需要安装code-server,输入y表示安装,其他则跳过:" isInstall
if [ ${isInstall} = "y" ]
then 
    configCodeServer
else
    echo "输入参数为:${isInstall},跳过code-server安装步骤!"
fi
read -p "是否需要拉取并编译c++代码,输入y表示安装,其他则跳过:" isInstallCpp
if [ ${isInstallCpp} = "y" ]
then 
    cppAutoBuild
else
    echo "输入参数为:${isInstallCpp},跳过c++代码拉取和编译步骤!"
fi
posted @ 2023-05-29 17:23  浪迹天涯的派大星  阅读(200)  评论(0)    收藏  举报