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这类系统脚本学习一下。


猜你喜欢

转载自blog.51cto.com/superleedo/2552607