• Shell-循环控制语句


    案例: jumpserver跳板机
    ssh连接框架:
    [root@test day5]# cat jumpserver.sh 
    #!/bin/bash
    WEB01=172.16.1.7
    WEB02=172.16.1.8
    NFS=172.16.1.31
    BACKUP=172.16.1.41
    DB01=172.16.1.51
    LB01=172.16.1.5
    LB06=172.16.1.6

    echo -e "\t\t\t\t\t\t 1.WEB01"
    echo -e "\t\t\t\t\t\t 2.WEB02"
    echo -e "\t\t\t\t\t\t 3.NFS"
    echo -e "\t\t\t\t\t\t 4.BACKUP"
    echo -e "\t\t\t\t\t\t 5.DB01"
    read -p "请输入要登录主机的编号: " num
    case $num in
           1|web01)
                  ssh $WEB01
           ;;
           2)
                  ssh $WEB02
           ;;
           3)
              ssh $NFS
           ;;
           *)
            echo "Usage: $0 [1|2|3|4]"
    esac
    ---------------------------------------------------

    运维代码:
    [root@test day5]# cat jumpserver.sh 
    #!/bin/bash
    WEB01=172.16.1.7
    WEB02=172.16.1.8
    NFS=172.16.1.31
    BACKUP=172.16.1.41
    DB01=172.16.1.51
    LB01=172.16.1.5
    LB06=172.16.1.6

    kf(){
            echo -e "\t\t\t\t\t\t 1.WEB01=172.16.1.7"
    }
    yw(){
    echo -e "\t\t\t\t\t\t 1.WEB01=172.16.1.7"
    echo -e "\t\t\t\t\t\t 2.WEB02=172.16.1.8"
    echo -e "\t\t\t\t\t\t 3.NFS=172.16.1.31"
    echo -e "\t\t\t\t\t\t 4.BACKUP=172.16.1.41"
    echo -e "\t\t\t\t\t\t 5.DB01=172.16.1.51"
    echo -e "\t\t\t\t\t\t h.显示菜单"
    }

    echo -e "\t\t\t\t\t\t 1.运维"
    echo -e "\t\t\t\t\t\t 2.开发"

    read -p "请选择你的身份: " num

    if [ $num -eq 1 ];then
        yw
        while true
        do
            read -p "请输入要登录主机的编号[h显示菜单]: " num
            case $num in
                   1|web01)
                      ssh $WEB01
                   ;;
                   2)
                      ssh $WEB02
                   ;;
                   3)
                      ssh $NFS
                   ;;
                   h)
                      clear
                      yw
                   ;;
                   *)
                    echo "Usage: $0 [1|2|3|4]"
            esac
        done
    fi
    --------------------------------------------------------------

    加入开发的代码:
    [root@test day5]# cat jumpserver.sh 
    #!/bin/bash
    WEB01=172.16.1.7
    WEB02=172.16.1.8
    NFS=172.16.1.31
    BACKUP=172.16.1.41
    DB01=172.16.1.51
    LB01=172.16.1.5
    LB06=172.16.1.6

    kf(){
            echo -e "\t\t\t\t\t\t 1.WEB01=172.16.1.7"
    }
    yw(){
    echo -e "\t\t\t\t\t\t 1.WEB01=172.16.1.7"
    echo -e "\t\t\t\t\t\t 2.WEB02=172.16.1.8"
    echo -e "\t\t\t\t\t\t 3.NFS=172.16.1.31"
    echo -e "\t\t\t\t\t\t 4.BACKUP=172.16.1.41"
    echo -e "\t\t\t\t\t\t 5.DB01=172.16.1.51"
    echo -e "\t\t\t\t\t\t h.显示菜单"
    }

    echo -e "\t\t\t\t\t\t 1.运维"
    echo -e "\t\t\t\t\t\t 2.开发"

    read -p "请选择你的身份: " num

    if [ $num -eq 1 ];then
        yw
        while true
        do
            read -p "请输入要登录主机的编号[h显示菜单]: " num
            case $num in
                   1|web01)
                      ssh $WEB01
                   ;;
                   2)
                      ssh $WEB02
                   ;;
                   3)
                      ssh $NFS
                   ;;
                   h)
                      clear
                      yw
                   ;;
                   *)
                    echo "Usage: $0 [1|2|3|4]"
            esac
        done
    elif [ $num -eq 2 ];then
        kf
        while true
        do
            read -p "请输入要登录主机的编号[h显示菜单]: " num
            case $num in
                   1|web01)
                      ssh $WEB01
                   ;;
                   2)
                      ssh $WEB02
                   ;;
                   3)
                      ssh $NFS
                   ;;
                   h)
                      clear
                      kf
                   ;;
                   *)
                    echo "Usage: $0 [1|2|3|4]"
            esac
        done

    fi
    ----------------------------------------------------

    完善脚本:
    [root@test day5]# cat jumpserver.sh 
    #!/bin/bash
    WEB01=172.16.1.7
    WEB02=172.16.1.8
    NFS=172.16.1.31
    BACKUP=172.16.1.41
    DB01=172.16.1.51
    LB01=172.16.1.5
    LB06=172.16.1.6

    kf(){
            echo -e "\t\t\t\t\t\t 1.WEB01=172.16.1.7"
    }
    yw(){
    echo -e "\t\t\t\t\t\t 1.WEB01=172.16.1.7"
    echo -e "\t\t\t\t\t\t 2.WEB02=172.16.1.8"
    echo -e "\t\t\t\t\t\t 3.NFS=172.16.1.31"
    echo -e "\t\t\t\t\t\t 4.BACKUP=172.16.1.41"
    echo -e "\t\t\t\t\t\t 5.DB01=172.16.1.51"
    echo -e "\t\t\t\t\t\t h.显示菜单"
    echo -e "\t\t\t\t\t\t 6|q.返回主菜单"
    }


    menu(){
    echo -e "\t\t\t\t\t\t 1.运维"
    echo -e "\t\t\t\t\t\t 2.开发"
    echo -e "\t\t\t\t\t\t 3|g.娱乐一下"
    }


    trap "echo 别乱按小心爆炸" INT HUP TSTP
    while true
    do
    menu

    read -p "请选择你的身份: " num
    if [ $num -eq 1 ];then
         while true
         do
         read -s -p "输入运维的密码: " pass
         if [ $pass = oldboy123 ];then
        echo "欢迎运维回家"
        yw
        while true
        do
            read -p "请输入要登录主机的编号[h显示菜单]: " num
            case $num in
                   1|web01)
                      ssh $WEB01
                   ;;
                   2)
                      ssh $WEB02
                   ;;
                   3)
                      ssh $NFS
                   ;;
                   h)
                      clear
                      yw
                   ;;
                   6|q)
                      break 2
                   ;;
                 woshiyunwei)
                         exit
                   ;;
                   *)
                         continue
            esac
        done
        else 
              let i++
              if [ $i -eq 3 ];then
                 echo "想想在输入"
             sleep 2
             continue
              fi
              echo "密码输入错误重新输入"
              continue
        fi
         done
    elif [ $num -eq 2 ];then
        kf
        while true
        do
            read -p "请输入要登录主机的编号[h显示菜单]: " num
            case $num in
                   1|web01)
                      ssh $WEB01
                   ;;
                   2)
                      ssh $WEB02
                   ;;
                   3)
                      ssh $NFS
                   ;;
                   h)
                      clear
                      kf
                   ;;
                 woshiyunwei)
                         exit
                   ;;
                   *)
                    echo "Usage: $0 [1|2|3|4]"
            esac
        done

     elif [ $num -eq 3 ];then
          sh game.sh
    fi
    done
    ------------------------------------------------------------------------------------------

    expect免交互发送秘钥
    [root@test day5]# cat test.ex 
    #!/usr/bin/expect
    set timeout 10 
    set user root
    set ip     172.16.1.31
    set password 1
    spawn ssh-copy-id  $user@$ip 
    expect { 
       "yes/no" { send "yes\n";exp_continue } 
       "password" { send "$password\n" } 
    }
    interact


    二.数组
    普通数组  只能以数字作为索引
    关联数组  可以使用字符串作为索引

    数组类似变量 不同的是变量只能有一个值 数组中可以放多个值
    变量: 
         框子1=苹果
         框子2=香蕉
         框子3=茄子
         name=oldboy
         ip=172.16.1.31
    数组:
         框子1[小盒子1]=苹果
         框子1[小盒子2]=香蕉
         框子1[小盒子3]=茄子


    数组语法:
    数组名称[索引的名称|下标]=值
    框子[盒子1]=苹果

    普通数组:
    第一种定义方式: 通过索引方式定义

        [root@test day5]# array[0]=shell
        [root@test day5]# array[1]=mysql
        [root@test day5]# array[2]=docker
        [root@test day5]# echo $array
        shell


    查看数组 按照索引的方式查看
        [root@test day5]# echo ${array[1]}
        mysql
        [root@test day5]# echo ${array[2]}
        docker
        [root@test day5]# echo ${array[0]}
        shell

    查看数组中所有的值
        [root@test day5]# echo ${array[*]}
        shell mysql docke

        [root@test day5]# echo ${array[@]}
        shell mysql docker

    临时取消数组
    [root@test day5]# unset array

    第二种定义数组方式: 直接定义默认索引从0开始
        [root@test day5]# array=(xiaohong xiaozi  xiaolv  xiaolan)
        [root@test day5]# echo ${array[*]}
        xiaohong xiaozi xiaolv xiaolan
        [root@test day5]# echo ${!array[*]}
        0 1 2 3

    大保健: 红浪漫

    红浪漫[1]=xiaohong
    红浪漫[2]=xiaolv
    红浪漫[3]=xiaozi

    查看房间内容
    echo 红浪漫[1]
    xiaohong
    查看所有的
    echo 红浪漫[*]


    第三种定义方式: 直接定义和通过索引定义
        [root@test day5]# array=(xiaozi  [666]=xiaolan [888]=xiaohong xiaolv )
        [root@test day5]# echo ${array[*]}
        xiaozi xiaolan xiaohong xiaolv
        [root@test day5]# echo ${!array[*]}
        0 666 888 889


    第四种定义方式: 命令定义
        [root@test day5]# ls
        expect.ex  game.sh  jumpserver.sh  test.ex
        [root@test day5]# array=(`ls`)
        [root@test day5]# echo ${array[*]}
        expect.ex game.sh jumpserver.sh test.ex
        [root@test day5]# echo ${!array[*]}
        0 1 2 3


    定义IP地址数组: 进行数组遍历
        [root@test day5]# ip=(172.16.1.7 172.16.1.2 172.16.1.31 172.16.1.51)
        [root@test day5]# echo ${ip[*]}
        172.16.1.7 172.16.1.2 172.16.1.31 172.16.1.51
        [root@test day5]# 
        [root@test day5]# for i in ${ip[*]};do echo $i;done
        172.16.1.7
        172.16.1.2
        172.16.1.31
        172.16.1.51

    写入脚本
        [root@test day5]# 
        [root@test day5]# cat array.sh
        #!/bin/bash
        ip=(172.16.1.7 172.16.1.2 172.16.1.31 172.16.1.51)

        for i in ${ip[*]}
        do
              echo $i
        done
        [root@test day5]# sh array.sh
        172.16.1.7
        172.16.1.2
        172.16.1.31
        172.16.1.51

    通过索引来遍历数组
        [root@test day5]# cat array.sh 
        #!/bin/bash
        ip=(172.16.1.7 172.16.1.2 172.16.1.31 172.16.1.51)

        for i in ${!ip[*]}
        do
              echo ${ip[$i]}
        done

        [root@test day5]# sh array.sh
        172.16.1.7
        172.16.1.2
        172.16.1.31
        172.16.1.51

    案例: 取数组中的值
        [root@test day5]# cat array.sh 
        #!/bin/bash
        ip=(172.16.1.7 172.16.1.2 172.16.1.31 172.16.1.51)
        for i in ${ip[*]}
        do
               ping -c1 -W1 $i &>/dev/null
               if [  $? -eq 0 ];then
               echo "ping $i is ok...."
               else
             echo "ping $i is error..."
               fi
        done

    查看普通数组:
    declare -a array='([0]="docker")'
    关联数组: 定义关联数组需要声明
    [root@test day5]# declare -A array
    [root@test day5]# array[index1]=shell
    [root@test day5]# array[index2]=mysql
    [root@test day5]# array[index3]=docker
    [root@test day5]# echo ${array[*]}
    shell mysql docker
    [root@test day5]# echo ${!array[*]}
    index1 index2 index3


    案例:
        [root@test day5]# unset array
        [root@test day5]# declare -A array
        [root@test day5]# #a b c 
        [root@test day5]# let a++
        [root@test day5]# let a++
        [root@test day5]# let b++
        [root@test day5]# let c++
        [root@test day5]# echo $a $b $c
        2 1 1
        [root@test day5]# let array[a]++
        [root@test day5]# let array[a]++
        [root@test day5]# let array[b]++
        [root@test day5]# let array[c]++
        [root@test day5]# #array[a]++ ========= array[a]=array[a+1]
        [root@test day5]# echo ${array[a]}
        2
        [root@test day5]# echo ${array[b]}
        1
        [root@test day5]# echo ${array[c]}
        1

    使用for循环依次取值:
        [root@test day5]# cat user.txt 
        a
        a
        b
        c
        [root@test day5]# #i=a
        [root@test day5]# #let array[$i]++
        [root@test day5]# #let array[a]++
        [root@test day5]# #let array[a]++
        [root@test day5]# #echo ${array[a]}
        [root@test day5]# #2
        [root@test day5]# #let array[b]++
        [root@test day5]# #let array[c]++
        [root@test day5]# echo ${array[a]}
        2
        [root@test day5]# #echo ${array[a]}
        [root@test day5]# #echo ${array[b]}
        [root@test day5]# #echo ${array[c]}


        [root@test day5]# cat array.sh
        #!/bin/bash
        declare -A array 
        for i in `cat user.txt`
        do
            let array[$i]++
        done
        for i in  ${!array[*]}
        do
            echo $i 出现了 ${array[$i]} 次
        done
        [root@test day5]# sh array.sh
        a 出现了 2 次
        b 出现了 1 次
        c 出现了 1 次

    统计bash的数量
        [root@test day5]# cat array1.sh
        #!/bin/sh
        declare -A array
        while read line
        do
             bash=`echo $line|awk -F: '{print $NF}'`
             let array[$bash]++
        done

        for i in ${!array[*]}
        do
            echo $i 出现了 ${array[$i]} 次
        done


        [root@test day5]# sh array1.sh
        /sbin/nologin 出现了 17 次
        /bin/sync 出现了 1 次
        /bin/bash 出现了 26 次
        /sbin/shutdown 出现了 1 次
        /sbin/halt 出现了 1 次

    数组统计IP出现次数:
        [root@test day5]# cat array1.sh 
        #!/bin/sh
        declare -A ips
        while read line
        do
             ip=`echo $line|awk '{print $1}'`
             let ips[$ip]++
        done

        for i in ${!ips[*]}
        do
            echo $i 出现了 ${ips[$i]} 次
        done


    shell结束..................................................
    常用内容:
    1.变量 全局 局部
    2.传参方法
    3.位置参数 $0 $# $n $?
    4.数值运算 expr $(()) $[] let bc awk python
    5.表达式 都支持命令
            或者 -o  并且 -a
            整数比较  man test
            [ 10 -eq 10 ]  -eq -ne -gt -ge -lt -le
            文件判断 
            [ -f /etc/hosts ] -f -d -e -r -w -x
            字符串比对
            [ test = test ] [ test != oldboy ]
            -z  为空则为真
            -n  不为空则为真
      正则比对[[ test =~ 正则 ]] 或者 || 并且 &&
      
    6.语法 
      if判断
      单分支 双分支 多分支
      for循环
      while循环
      exit
      break
      continue
      函数 定义 传参 变量 返回值 可以复用
      case
      数组 普通数字
      定义和遍历
      ip=(10.0.0.7 10.0.0.31)
      echo ${ip[*]}


      
            
        

  • 相关阅读:
    小咖批量剪辑助手款视频批量自动剪辑软件
    python---网络编程
    超详细的PHP入门知识点讲解
    蒙特卡洛方法的简单应用
    【入门篇】1.4 redis 客户端 之 Lettuce 详解
    绑定设备文件与设备
    SpringCloud之NamedContextFactory
    mysql binlog
    华为OD机考算法题:评论转换输出
    java基本数据类型Char
  • 原文地址:https://blog.csdn.net/lpx1249115962/article/details/133214041