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