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[*]}


  
        
    

你可能感兴趣的:(linux,服务器,运维)