一、一段脚本

最近写的一个脚本,公司测试环境使用,用于自动拉取前、后端代码,编译成功后自动发布

有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 != str2str1是否不等于str2,若不等则返回true

2.7 整数之间的判断,支持正负数不支持小数

int1 -eq int2两数值相等(equal)
int1 -ne int2两数值不等(not equal)
int1 -gt int2n1大于n2(greater than)
int1 -lt int2n1小于n2(less than)
int1 -ge int2n1大于等于n2(greater than or equal)
int1 -le int2n1小于等于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是否为同一文件

 

Shell 脚本 - 自动拉取GIT代码+编译3518EV200固件代码

Logo

前往低代码交流专区

更多推荐