shell基本语法及tomcat自动部署脚本

0. Intro

1.1 填坑动力

  1. 以前总是拿着别人的shell脚本修改...实在是蛋疼

1.2 学完的感觉

  1. 这语法和一般的不太一样...
  2. 会基本语法也没啥大用... 还是要多用命令...记住参数...
  3. 至少基本shell大体上是能看懂了
  4. shell只适合写点小功能

1. shell基本语法

#!/bin/sh
#上面写法是一个约定,告诉linux系统使用哪个解释器
#----------------------------------变量的声明及赋值及删除--------------------------------
#变量的声明及赋值,下面的赋值形式都可以;变量名只允许字母数字和下划线,不允许数字开头及空格
#注意=号两面不允许有空格;注意shell的变量只有字符串类型
your_name="yournamestr"
# \转义符号
echo "this is defined by \"\" ${your_name}"
your_name='yournamestr'
#注意:""里面的$符号会被解析,''里面的不会被解析会原样输出
echo "this is defined by '' ${your_name}"
echo 'this is defined by ''${your_name}'
#下面这中形式赋值要求值不能包含任何空格
your_name=yournamestr
echo "this is defined by nothing ${your_name}"
#变量取值,以下两种形式均可以,但是默认加{}会有助于解释器确定变量名的符号边界 下面第一行会正常输出 第二行会取your_nametest变量的值,因为没有定义所以无输出 第三行中间加了一个空格并不是想要结果
echo '${your_name}='${your_name}test
echo '$your_nametest='$your_nametest
echo '$your_name test='$your_name test
#下面是字符串拼接
echo "this is ${your_name}"
echo this is ${your_name}
# 将变量设为只读模式:和ava中final关键字一个意思
readonly your_name
#变量删除
unset_test="unset_test"
unset unset_test

#表达式赋值,以下两种都可以,但是推荐下面第一行的写法,第二行的`` 和''太相似容易迷惑
files=$(ls /)
echo files
for fileName in files;do
  echo ${fileName}
done
echo '===================================='
files=`ls /`
echo files
for fileName in files;do
  echo ${fileName}
done

# 变量分为局部变量和环境变量
# 1. 局部变量是指在脚本中定义的仅在当前脚本有效的变量值
# 2. 如上面的your_name 等等
# 3. 下面的尽管没有在当前脚本没有定义,依然有输出,这些比如PATH就是环境变量
echo 'PAH='${PATH}
#------------------------------------------------------------------
# 特殊含义的变量:
# $$表示当前shell进程Id
# $0 表示当前脚本文件名
# $n 表示传给当前脚本或者函数的第N个参数
# $# 表示传给脚本的或者函数的参数的个数
# $* 传递给脚本或函数的所有参数
# $@ 传递给脚本或函数的所有参数,与上面略有不同:当不被""包含时间$*和$@都是返回一个数组;被""包含时$* 返回的是一个字符串$@还是一个数组
# $? 上个命令的退出状态或者返回值
echo "pid=$$"
echo "script fileName=$(pwd)/$0"
echo "param size=$#"
# "$*" 返回的是一个字符串
for param in "$*";do
  echo ${param}
done
# "$@"返回的是一个数组
for param in "$@";do
  echo ${param}
done
#-----------------------------------------------------------------
# 运算符两侧需要空格
val=`expr 1 + 1`
echo ${val}
a=10
b=10
#*号需要转义
echo `expr ${a} \* ${b}`
echo `expr ${a} == ${b}`
if [ $a == $b ]
then
  echo "a==b is 1"
fi
#-----------------------------------------------------------------
# 关于字符串的相关操作
str="asdfg"
echo "str长度是"${#str}
#1为index 2为长度
echo "字符串截取"${str:1:2}
# 这个有问题... 不太对,不要使用这个
echo "字符串是否包含子串,下标开始位置为"`expr index ${str} dd`
# 注意都是1,我还以为会是5呢。。。
echo ${#str[@]}
echo ${#str[*]}
#-----------------------------------------------------------------
# 数组 元素之间需要用空格隔开
arrayexample=("11" "12" "13" "14")
arrayexample[4]="15"
for value in ${arrayexample[*]} ;do
  echo $value
done
for((index=0;index<${#arrayexample[*]};index++)) do
  echo ${arrayexample[index]}"<>"${#arrayexample[index]}
done
#-----------------------------------------------------------------
# 判断语法
function testIf(){
# if fi判断,注意 if后面有一个空格且判断语句前后与[]都要有一个空格,比如:if [ a==b ] 或者if [ a == b ]
  if [ 1 == 1 ]
    then 
      echo '1==1'
  fi
# if else
  if [ 1 == 2 ]
    then 
      echo '1==2'
  else
    echo '1!=2'
  fi
# if... elif...fi
  if [ 1==2 ]
    then
       echo '1==2'
  elif [ 1==3 ]
    then
      echo '1==2'
  else
    echo 'end if'
  fi
}
testIf
#-----------------------------------------------------------------
# 循环语法
function testLoop(){
  echo "for index loop"
  for((a=1;a<=4;a++));do
	echo $a
  done
  echo "for each loop"
  for fd in $(ls ./) ;do 
	echo $fd
  done
  echo "while loop"
  b=0
  while((b<10))
  do
	echo $b
	let b++
  done
  echo "until loop"
  a=0
  until [ ! $a -lt 10 ]
  do
   echo $a
   a=`expr $a + 1`
  done
}
testLoop
#-----------------------------------------------------------------
# 定义函数 及返回值及 函数调用 及echo 和return
function checkPathExist(){
  if [ -e $1 ]
  then
    echo 0;
  else
    echo 1;
  fi
  return 127;
}
#checkPathExist $1
value=$(checkPathExist $0)
value2=$?
value3=`echo "12344"`
echo "value=${value},意思是从输出缓存行获取第一行的值"
echo "value2=${value2},意思是获取返给bashshell的statusCode"
echo "value3=${value3},意思是获取echo函数的返回给bash解释器的statusCode"

2.一个webapp部署小脚本

#!/bin/sh
#项目的版本
project_name="test"
project_version="1.0-RELEASE"
shutDownPort="8090"
httpPort="9090"

originwarPath="/opt/wars/${project_name}/${project_name}-${project_version}.war"
tomcatPath="/opt/apache-tomcat-7.0.94-deploy.tar.gz"
deployPath="/opt/deploy/${project_name}/"
deployLockPath="/opt/deploy/${project_name}/lock.lock"
# 部署文件锁,需要排他锁
function LockFile(){
  flock -x ${deployLockPath}
}
#部署文件锁:解锁
function UnLockFile(){
  flock -u ${deployLockPath}
}
#检测目录是否存在
function checkPathExist(){
  if [ -e $1 ]
  then
    echo 0;
  else
    echo 1;
  fi
}
# 停止当前应用TOMCAT
function stopCurentAppTomcat(){
  pid=`ps -ef|grep ${deployPath} | grep -v grep |cut -c 10-15`
  if [ ${#pid[*]} -gt 0 ]
  then
    echo "${project_name} is running with pid ${pid},now top it"
    sh ${deployPath}bin/shutDown.sh
    echo 0
  else
    echo "${project_name} is not running,just return"
    echo 1;
  fi
}

# 初始化部署目录
function initTomcat(){
  if [ -e ${deployPath} ]
    then
      #clear Current work path
      echo "tomcat inited,now clearn webapps dir"
      cd ${deployPath}webapps/
      rm -rf ./*
      echo "now copy war packs to ${deployPath}"
      cp $originwarPath $deployPath/webapps/ROOT.war
  else
    echo "now  copy tomcat to ${deployPath}"
    tar -xvf ${tomcatPath} -C ${deployPath}
    sed -i 's%{shutdownPort}%${shutDownPort}%g' ${deployPath}conf/server.xml
    sed -i 's%{httpPort}%${httpPort}%g' ${deployPath}conf/server.xml
    echo "now copy war packs to ${deployPath}"
    cp $originwarPath $deployPath/webapps/ROOT.war
  fi
}

# 启动tomcat
function startTomcat(){
  sh ${deployPath}bin/startup.sh
}
#开始启动部署逻辑
echo "begin deploy ${project_name}-${project_version}"
LockFile;
exists=$(checkPathExist ${deployPath});
if [ ${exists} -gt 0 ]
then
   echo "tomcat in ${deployPath}  not exist,begin initTomcat"
else
   echo "${deployPath} exists,now stop currentTomcat"
   stopCurrentAppTomcat
   echo "ensure tomcat stopped finished"
fi
echo "begin initTomcat and prepare war packs"
initTomcat;
echo "tomcat and webapp is deployed to ${deployPath},now start tomtcat"
startTomcat;
UnLockFile
echo "deploy completed"

3. Linux常用命令(想到哪个写哪个,暂时不写 后期补充)

3.1 ps/pstree

这个是查询进程的,一般要和grep搭配使用:比如查询tomcat 进程ps -ef|grep tomcat或者 ps -auf |grep tomcat

3.2 grep

在查询具有特定字符串的字符串,如上面

3.3 vi/vim

编辑文本的工具: 编辑模式:摁i键; 退出vi:输入:,然后输入q,或者!q(强制退出) 或者wq 保存退出 显示行号:输入:,然后输入set number 代码高亮:输入:,然后输入syntax on 其他的还有很多...这个完全可以再写一章了...

3.4 cat

cat 一个文件。。会输出全部的内容到 console上,一般查询日志的时候多点 和 grep 配合使用

3.5 netstat/ifconfig

netstat 查看当前网络监听等状况,一般需要配置grep 使用netstat -apn|grep 8080 查询 占用8080端口的进程

3.6 chmod/chown

修改文件权限及所有者的。。

3.7 crontab

定时任务

3.8 flock

对fd进行加锁,独占,共享等等吧。。

3.9 iptables(这个有点多,后期再补吧)

防火墙编辑器。。。这个太多了。。我也不会...

3.10 mount/umount

磁盘挂载和卸载

3.11 top/free/df

查看系统资源占用额

3.12 xargs

传递参数的,比如批量强制杀死tomcat进程: ps -ef|grep sh |grep -v grep |cut -c 12-16|xargs kill -9

3.13 kill

用来像进程发送信号,比如上面的信号-9; 对于不同的信号有不同的逻辑,-9就是强制杀死进程,而且进程捕获不到这个信号

3.14 > 输入输出流重定向

把系统的标准\错误输出流重定向到一个位置;tomcat-startip.sh > startup.log 把tomcat的启动日志输出到startup.log文件中

3.15 | 管道符号

意思是把上个命令的输出等等 带入到下个命令的输入中区

3.15 nohup &

用于启动一个后台服务。。不至于当前的shell关闭后服务就挂掉,nohup ./tomcat-start.sh & > tomcat.log

4. 先留个尾巴吧。。等着以后再补充

转载于:https://my.oschina.net/Aruforce/blog/3040364

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值