Shell 脚本 - 自动拉取GIT代码+编译前后端代码+发布
一、一段脚本这个最近写的一个脚本,公司测试环境使用,用于自动拉取前、后端代码,编译成功后自动发布有2个参数:参数1 -- 代码的版本号参数2 -- java=后端代码,vue=前端代码,all=前后端一起后端代码编译后是通过软链接给docker的容器使用,前端代码编译后是通过软链接给nginx调用BuildVersion=$1BuildItem=$2Bu...
一、一段脚本
最近写的一个脚本,公司测试环境使用,用于自动拉取前、后端代码,编译成功后自动发布
有2个参数:
-
参数1 -- 代码的版本号
-
参数2 -- java=后端代码,vue=前端代码,all=前后端一起
后端代码编译后是通过软链接给docker的容器使用,前端代码编译后是通过软链接给nginx调用
BuildVersion=$1
BuildItem=$2
BuildEnv=uat
BaseDir=/hc/src/code
BuildTime=$(date '+%Y%m%d%H%M%S' )
if [ -z "$BuildItem" ]; then
echo -e "\033[41;33m Please enter the project you want to compile \033[0m"
exit
fi
function gitFile()
{
CodeDir=$1
#echo "[$1],[$2]"
#return
if [ -d "${CodeDir}" ]; then
echo dir ${CodeDir} exist
cd $CodeDir
git pull
else
echo dir ${CodeDir} not exist
git clone --progress --branch develop-v$BuildVersion -v "http://<GIT用户名>:<GIT密码>@<GIT服务器>/parking-java/$2" $CodeDir
fi
}
function buildVue()
{
echo -e "\033[42;37m build parking-vue $BuildVersion ...... \033[0m"
vueDir=$BaseDir/vue/$1
gitFile $vueDir "parking-frontend.git"
cd $vueDir
i18nDir=$vueDir/node_modules/moment
if [ ! -d "${i18nDir}" ]; then
#-g = -global
npm install --save moment vue-i18n
fi
npm run build
ln -snf $vueDir/dist /hc/dist
#echo "vueDir=$vueDir"
#echo "i18nDir=$i18nDir"
echo -e "\033[42;37m build parking-vue is released \033[0m"
}
function buildJava()
{
echo -e "\033[42;37m build parking-java $BuildVersion ...... \033[0m"
docker stop tomcat1
javaDir=$BaseDir/java/$1
#echo "javadir=$javaDir"
gitFile $javaDir "parkingV1.git"
mvn clean package -f $javaDir -P$BuildEnv
cat /hc/src/code/uat.properties >> $javaDir/target/parking-1.0/WEB-INF/classes/sysconfig-uat.properties
ln -snf $javaDir/target/parking-1.0 /hc/parking
docker start tomcat1
echo -e "\033[42;37m build parking-java is released \033[0m"
}
if [ "java" == "$BuildItem" ] ; then
buildJava $BuildVersion
elif [ "vue" == "$BuildItem" ] ; then
buildVue $BuildVersion
elif [ "all" == "$BuildItem" ] ; then
#echo -e "\033[42;37m build parking-all $BuildVersion ...... \033[0m"
buildVue $BuildVersion
buildJava $BuildVersion
else
echo -e "\033[41;33m Please enter the project you want to compile: java, vue or all \033[0m"
fi
二、Shell语法
Shell脚本不怎么经常写,一些语法记不住,每次写脚本时都要去Baidu语法,还是把自己用到的一部分Shell语法记录下来比较方便
2.1 exit和return的区别
exit是退出进程,return是退出函数
2.2 if 条件;then中的“;”符号
当 if 和 then 位于同一行的时候,这个分号是必须的,否则会有语法错误,如果then是另起一行的写法,这个分号可以省略。
2.3 shell中的空格
赋值语句中“=”两边不能有空格,而字符串比较中“=”、“==”两边必须有空格,[]、[[]]前后一定要加空格。
2.4 []和[[]]的区别
test、[]以及[[]]都使用条件表达式来完成测试,[]无法实现的功能是正则表达式匹配,而[[]]可以实现。除了模式匹配和正则表达式匹配时需要使用[[]],其余时候建议使用[]。
- [[]]支持&&、||,而[]不支持,[]中用-a(and)、-o(or)。
- [[]]支持字符串的模式匹配,而[]不支持。如[[ "hello" == hell? ]]为真,[[ "hello" == "hell?" ]]为假。
- [[]]支持算术扩展,而[]不支持。如if [[ 1+2 -eq 3 ]]。
2.5 "双引号的使用
无论是[]还是[[]],都建议对其内的变量、字符串使用双引号包围。
say="Ni Hao"
[ $say = "Ni Hao" ]
等价于执行的是[ Ni Hao = "Ni Hao" ],这是错误的语法,所以建议加上双引号。
2.5 !感叹号的使用
!时表示结果取反
2.6 字符串的判断
-z string | (zero)判定字符串是否为空?若string为空字符串,则为true |
string -n string | 判定字符串是否非空?若string为空字符串,则false。注:-n可省略 |
string1 = string2 string1 == string2 | string1和string2是否相同,相同则返回tru,e"=="和"="等价。 |
str1 != str2 | str1是否不等于str2,若不等则返回true |
2.7 整数之间的判断,支持正负数不支持小数
int1 -eq int2 | 两数值相等(equal) |
int1 -ne int2 | 两数值不等(not equal) |
int1 -gt int2 | n1大于n2(greater than) |
int1 -lt int2 | n1小于n2(less than) |
int1 -ge int2 | n1大于等于n2(greater than or equal) |
int1 -le int2 | n1小于等于n2(less than or equal) |
2.8 文件类检测
-e file | 文件是否存在(exist) |
-f file | 文件是否存在且为普通文件(file) |
-d file | 文件是否存在且为目录(directory) |
-b file | 文件是否存在且为块设备block device |
-c file | 文件是否存在且为字符设备character device |
-S file | 文件是否存在且为套接字文件Socket |
-p file | 文件是否存在且为命名管道文件FIFO(pipe) |
-L file | 文件是否存在且是一个链接文件(Link) |
2.9 文件属性检测
-r file | 文件是否存在且当前用户可读 |
-w file | 文件是否存在且当前用户可写 |
-x file | 文件是否存在且当前用户可执行 |
-u file | 文件是否存在且设置了SUID |
-g file | 文件是否存在且设置了SGID |
-k file | 文件是否存在且设置了sbit(sticky bit) |
-s file | 文件是否存在且大小大于0字节,检测文件是否为非空白文件 |
-N file | 文件是否存在,且自上次read后是否被modify |
2.10 两个文件之间的比较
file1 -nt file2 | (newer than)判断file1是否比file2新 |
file1 -ot file2 | (older than)判断file1是否比file2旧 |
file1 -ef file2 | (equal file)判断file2与file2是否为同一文件 |
更多推荐
所有评论(0)