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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通