首页 > 系统相关 >Shell脚本实战(一)

Shell脚本实战(一)

时间:2023-05-29 17:34:49浏览次数:34  
标签:实战 脚本 Shell echo git fi 文件夹 cloud

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

标签:实战,脚本,Shell,echo,git,fi,文件夹,cloud
From: https://www.cnblogs.com/zhaodalei/p/17425595.html

相关文章

  • EBS: FORM窗体开发使用VIEW模式开发,plsql DEVELOPER 自动生成PLSQL脚本
    FORM窗体开发使用VIEW模式开发,plsqlDEVELOPER自动生成PLSQL脚本,CREATEORREPLACEPACKAGEAPPS.HAND_PLSQL_AUTOCREATEAUTHIDCURRENT_USERAS/*$Header:HDPLSATC.pls115.12004/09/0215:33:09pkmship$*/PROCEDUREregist_table(p_table_nameINVARCHAR2,......
  • Netty实战(七)
    (EventLoop和线程模型)一、什么是线程模型简单地说,线程模型指定了操作系统、编程语言、框架或者应用程序的上下文中的线程管理的关键方面。在早期的Java语言中,我们使用多线程处理的主要方式无非是按需创建和启动新的Thread来执行并发的任务单元,这种在高负载下表现得很原......
  • UE蓝图脚本类结构
    UObjectBaseUObjectBaseUtilityUObjectUSubsystemUDynamicSubsystemUEditorSubsystemUEditorActorSubsystem--SpawnActorFromObjectUObjectBaseUObjectBaseUtilityUObjectUEditorUtilityObjectUActorActionUtilityUActorActionUtility:publicUEditorUtili......
  • powershell 更新版本
    在Windows操作系统中,可以使用PowerShell命令行工具来更新版本。具体地说,可以按照以下步骤进行操作:打开PowerShell:在开始菜单中搜索“PowerShell”,然后单击打开。检查Windows版本:在PowerShell命令行中输入“winver”,然后按回车键执行。这将显示当前Windows版本的详细信息,包括......
  • 《Node.js后端全程实战》自序
    《Node.js后端全程实战》自序《JavaScript全栈开发》:https://book.douban.com/subject/35493728/《Vue.js全平台前端实战》:https://book.douban.com/subject/35886403/《Node.js后端全程实战》:https://book.douban.com/subject/36374893/《Node.js后端全程实战》这本书......
  • shell正则匹配捕获引用进行IP匹配
    在服务器上加了一个服务检测机制,用到正则来匹配IP和捕获分组。shell和其他语言一样也可以使用正则分组捕获,不过不能使用$1或1这样的形式来捕获分组,可以通过数组${BASH_REMATCH}来获得,如${BASH_REMATCH[1]},${BASH_REMATCH[N]}简单的测试如下所示:#!/bin/baship="121.0.2.2"if[......
  • 【LeetCode双向链表】LRU详解,双向链表实战
    LRU缓存请你设计并实现一个满足LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intkey,intvalu......
  • Shell常见命令
    Shell是一个应用程序,它负责接收用户输入的命令,然后根据命令做出相应的动作,Shell负责将应用层或者用户输入的命令传递给系统内核,由操作系统内核来完成相应的工作,然后将结果反馈给应用层或者用户 2.4Shell命令的格式如下: command-options[argument]  command:......
  • Netty实战(六)
    (ChannelHandler和ChannelPipeline)一、ChannelHandler1.1Channel的生命周期Channel主要有四个生命周期向下表所示:状态描述ChannelUnregisteredChannel已经被创建,但还未注册到EventLoopChannelRegisteredChannel已经被注册到了EventLoopChannelActiv......
  • [20230516]完善spsw.sql脚本.txt
    [20230516]完善spsw.sql脚本.txt--//以前写的spsw.sql脚本通过加入提示,产生好的执行计划(sql_id=good_sql_id),替换有问题的sql语句(bad_sql_id).--//现在遇到一个问题,就是现在的dg可以做只读查询,里面的sql语句没有在主库执行过,我抽取的脚本在sqlplus执行时里面的\r字符给--//......