运维开发网

shell脚本应用示例

运维开发网 https://www.qedev.com 2020-11-25 12:36 出处:51CTO 作者:super李导
第四章 | 4.3 shell脚本应用示例

4.3.1 判断语句

  1) if语句的格式:

    if 条件 then 命令 fi

    if 条件 then 命令 else 命令 fi

    if 条件 then 命令 elif 条件 then 命令 else 命令 fi

  if判断语句示例:

  a例:判断当前用户是否为root,如果是,则执行/home/test 目录压缩

    #!/bin/bash

    if [ "$(id -u)" -eq "0" ];then

    tar czf /home/test.tar.gz /home/test 

    fi

  b例:要求用户输入密码,并判断输入是否正确

    #!/bin/bash

    read -p "please enter your passwd: " passwd

    if [ "$passwd" == "123456" ];then

    echo "passwd is ok!"

    else

    echo "passwd error! please input your passwd again "

    fi

  c例:判断kpi评级,60~70是D级,70~80是C级,80~90是B级,大于90是A

    #!/bin/bash

    export LANG="zh_CN.UTF-8"

    if [ $1 -ge 90 ];then

    echo "A绩效优秀"

    elif [ $1 -ge 80 ];then

    echo "B绩效良好"

    elif [ $1 -ge 70 ];then

    echo "C绩效一般"

    elif [ $1 -ge 60 ];then

    echo "D绩效合格"

    else

    echo "绩效差"

    fi

  2)case 判断语句格式:

  格式1:

    case $变量名 in

      模式1)

        命令

        ;;

      模式2)

        命令

        ;;

      *)

    esac

  格式2:

    case $变量名 in

      模式1|模式2)

        命令

        ;;

      模式3|模式4)

        命令

        ;;

      *)

    esac

  case判断语句示例:

  d例:判断单个字符是数字还是字母

    #/bin/bash

    export LANG="zh_CN.UTF-8"

    read -p "请输入: " pake

    case $pake in

      [a-z] | [A-Z])

    echo "您输入的是字母"

    ;;

      [[:digit:]])

    echo "您输入的是数字"

    ;;

      *)

    echo "无法识别特殊字符"

    esac

  e例:每月指定日期备份删除日志

    #/bin/bash

    DATE=$(date +%d)

    TIME=$(date +%Y+%m+%d)

    case $DATE in

      1|11|21)

    tar -czf /home/log/${TIME}_log_tar.gz /tmp/log/&>/dev/null

    ;;

      2|12|22)

    rm -rf /tmp/log/*.2020-*.log

    ;;

      *)

    echo "今天不删除也不备份"

    esac

4.3.2 循环语句

   1)for语句

  语法格式:

    for 变量 in 值(或者循环条件)

    do 

    命令

    done

  for语句示例:打印9*9的乘法口诀

    #!/bin/bash

    for k in {1..9}

    do

      for ((p=1;p<=k;p++))

      do

        printf "%-10s" $p*$k=$((p*k))

      done

      echo

    done

  2)while语句

  语法格式:

  while 条件 do 命令 done

  while read -r line do 命令 done < file

  while语法示例:批量添加10个用户

    #!/bin/bash

    u=1

    while [ $u -le 10 ]

    do

    useradd user${ $u }

    u=$((u+1))

    done

   3)until语句

  语法格式:

  until 条件 do 命令 done

  示例:批量删除用户

    #!/bin/bash

    u=6

    until [ $u -eq 0 ]

    do

    userdel user${ $u }

    u=$((u-1))

    done

  4)select语句

  示例:用select生成购物询问

    #!/bin/bash

    export LANG="zh_CN.UTF-8"

    echo "你想买哪一个颜色"

    select var in "红色" "蓝色" "绿色" "黄色" "小麦色"

      do

    break

      done

    echo "你选择的是: $var"

   5)控制语句

    shift 将位置参数左移一位,也就是说执行shift后,$2变成$1,

    countinue 中断当前循环,进入下一个循环

    break 结束整个循环

    exit 结束脚本的运行

4.3.3 mysql备份

  备份test数据库的脚本示例:

  #!/bin/bash 

  export LANG="zh_CN.UTF-8"

  USER=root 

  PASSWD="123456" 

  DATABASE="test" 

  HOSTNAME="192.168.1.137" 

  BACKUP_DIR=/home/backup/ 

  LOGFILE=/home/backup/mysql_backup.log

  DATE=`date '+%Y-%m-%d-%H-%M'`

  DUMPFILE=test_$DATE.sql

  ARCHIVE=test_$DATE.sql.tgz

  OPTIONS="-h$HOSTNAME -u$USER -p$PASSWD $DATABASE" 

  if [ ! -d $BACKUP_DIR ] ; 

  then 

       mkdir -p "$BACKUP_DIR" 

  fi 

  echo " " >> $LOGFILE 

  echo "———————————————–" >> $LOGFILE 

  echo "备份开始时间:" $(date +"%y-%m-%d %H:%M:%S") >> $LOGFILE 

  echo "———————————————– " >> $LOGFILE 

  cd $BACKUP_DIR 

  mysqldump $OPTIONS > $DUMPFILE 

  if [[ $? == 0 ]]; then 

    tar czvf $ARCHIVE $DUMPFILE >> $LOGFILE 2>&1 

    echo "[$ARCHIVE] 备份成功" >> $LOGFILE 

    rm -f $DUMPFILE 

  else 

    echo "数据库备份失败....." >> $LOGFILE 

  fi 

  echo "数据库备份完成!!"

4.3.4 机器互通

    免密互通需要使用ssh和except,先安装except,yum install expect expect-devel tcl -y

  脚本示例:

  #!/bin/bash

  echo "按enter键3次即可"

  ssh-keygen -t rsa #生成秘钥(按enter键3次即可生成)

  SERVERS="arango mysql es redis" #主机名

  PASSWORD=123456 #主机登录密码

  auto_ssh_copy_id(){

      expect -c "set timeout -1;

      spawn ssh-copy-id $1; 

      expect {

          *(yes/no)* {send -- yes\r;exp_continue;}

           *password:* {send -- $2\r;exp_continue;} 

          eof {exit 0;}

      }";

  }

  ssh_copy_id_to_all(){

      for SERVER in $SERVERS #遍历要发送到各个主机的ip

      do

          auto_ssh_copy_id $SERVER $PASSWORD

      done

  }

  ssh_copy_id_to_all

4.3.5 URL状态检测

  检测脚本示例:

  #!/bin/bash

  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/loacl/sbin:~/bin

  export PATH

  . /etc/rc.d/init.d/functions

  check_count=0

  url_list=(http://www.baidu.com https://blog.51cto.com http://www.qq.com http://192.168.1.5)

  function wait()

  {

  echo -n '3秒后开始执行检查UEL操作';

  for ((i=1;i<4;i++))

  do

  echo -n "$i...";sleep 1

  done

  echo

  }

  function check_url()

  {

  wait

  for ((i=0;i<`echo ${#url_list[*]}`;i++))

  do

  wget -o /dev/null -T 3 --tries=1 --spider ${url_list[$i]} >/dev/null 2>&1

  if [ $? -eq 0 ]

  then

  action "${url_list[$i]}" /bin/true

  else

  action "${url_list[$i]}" /bin/false

  fi

  done

  ((check_count++))

  }

  main()

  {

  while true

  do

  check_url

  echo "----------check_count:$check_count----------"

  sleep 2

  done

  }

  main

4.3.6 跳板机

  跳板脚本示例:

  #!/bin/bash

  trapper() {

   trap ':' INT EXIT TSTP TERM HUP

  }

  

  main() {

  while :

  do

  trapper

  clear

  cat<<EOF

   1)web01-192.168.1.5

   2)web02-192.168.1.6

   3)web03-192.168.1.7

   4)mysql-192.168.1.8

   0)exit

  EOF

  read -p "please input the num: " num

  case "$num" in

   1)

   echo 'login in 192.168.1.5 web01-nginx'

   ssh 192.168.1.5

   ;;

   2)

   echo 'login in 192.168.1.6 web02-nginx'

   ssh 192.168.1.6

   ;;

   3)

   echo 'login in 192.168.1.7 web03-nginx'

   ssh 192.168.1.7

   ;;

   4)

   echo 'login in 192.168.1.8 mysql-192'

   ssh 192.168.1.8

   ;;

   0)

   echo '退出'

   exit

   ;;

   *)

   echo "the num you have input is error"

  esac

  done

  }

  main

4.3.7 菜单式发布应用

  脚本示例:

  #!/bin/bash

  export LANG="zh_CN.UTF-8"

  menu(){

   cat << END

   请选择需要更新的服务

   =======================

   1.app

   2.admin

   3.exit

   =======================

  END

  }

  TIME=`date +%Y-%m-%d-%H-%M`

  tomcat_pid=`ps -ef |grep "tomcat"|grep "apache"|awk -F ' ' '{print $2}'`

  app(){

   cd /data/service/

   cp -a app /backup/app-$time

   cd app/project/

   cp -a /package/app/app*.tar.gz .

   rm -rf lib

   tar zxf app*.tar.gz

   cp -a project/lib .

   /bin/bash init.sh stop

   /bin/bash init.sh start

   cd /backup/app-$time/project/

   rm -rf logs

   echo "++++++++++++++++app更新成功++++++++++++++"

  }

  web(){

   cd /data/www/

   cp -a web /backup/web-$time

   cd web/

   rm -rf ./*

   cp -a /package/web/web*.tar.gz .

   tar zxf web*.tar.gz

   rm -f web*.tar.gz

   echo "++++++++++++++++web更新成功++++++++++++++"

  }

  

  main(){

   while true

   do

   menu

   read -p "请输入服务的序号以更新服务:" num

   case "$num" in

   1)

   app

   ;;

   2)

   web

   ;;

   3)

   exit 1

   ;;

   *)

   printf "输入错误 请重新输入对应数字"

   esac

   done

  }

  main 

  以上的脚本示例仅仅是最简单的应用,shell脚本写法自由,格式限制少,功能多是简介明了,当需要复杂示例时候,可以查看像/etc/init.d/functions这类系统脚本学习一下。

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号