• while,shift,until,case



    脚本趋势:自动化、可视化
    编写一个好脚本的要素:

    • 逻辑结构清晰
    • 脚本可以重用
    • 多加入注释

    学会调试脚本:

    • echo配合exit命令或sleep命令–》退出脚本|等待几秒继续,默认1s
    • bash -x 脚本–》看到脚本的执行过程
    • read 断点功能

    while语句

    while 条件
    do
        执行动作
    done

    ①例子1:

    #!/bin/bash
    i=1
    while    ((i<=10)) --》while后面可以空格
    do
            echo $i
            sleep 0.3
            ((i++))
    done

    ②例2:间接引用

    #!/bin/bash
    i=1
    while ((i<=$#))  --》位置变量的个数
    do
        echo ${!i} --》间接引用
        ((i++))
    done

    执行结果:

    这里写图片描述

    间接引用:

    这里写图片描述

    ③while read 文件里的变量名
    例3:
    user.txt:
    这里写图片描述

    #cat while3.sh:
    #!/bin/bash
    while read age name sex address -->变量名
    do
            echo -e "$age	$name	$sex	$address"
    done <user.txt --》输入重定向

    执行结果:
    这里写图片描述

    分析:

    • while配合read从文件里取东西的时候,是一行一行的取出。以空白(空格和tab)作为分隔符,再赋值给read后面接的变量,会根据变量的个数一一对应。
    • 如果只有一个变量,就将整行给这个变量,如果有多个变量,变量的数量和分隔出来的字段相等,则一一对应给变量,如果分隔出来的字段大于变量的数量,则将多出来的字段一起给最后一个变量,如果变量的数量超过分隔出来的字段的数量,则多余的变量为空值。

    ④管道 + while read 变量名 –》也是从文件读取!!
    例4:

    #!/bin/bash
    n=1
    cat /etc/passwd|while read line
    do
        echo -e "chinaitsoft:	$n 	$line"
        ((n++))
    done

    执行结果:

    这里写图片描述

    死循环的危害:
    主要看死循环里做什么事情

    • 1.消耗cpu –》计算类型
    • 2.磁盘i/o –》dd
    • 3.消耗内存
    • 4.消耗网络带宽 –》不停地下载

    ⑤死循环消耗cpu、内存的例子:

    #cat while4.sh
    i=1
    while true
    do
        echo “$i”
        ((i++))
        bash /lianxi/while4.sh
    done

    每次产生1个1M大小的文件来消耗内存的例子:

    #cat while4.sh
    i=1
    while true
    do
        echo “$i”
        ((i++))
      (dd   if=/dev/zero    of=dd.dd$i    bs=1M   count=1)&
    done
    
    --》每次产生11M大小的文件,并且放到后台去运行。

    跳出死循环的方法:

    • exit:退出脚本
    • break:跳出循环(for、while、until)

    ⑤跳出死循环
    只有输入end才结束,否则一直在输入状态

    #!/bin/bash
    while :
    do
        read -p "Please input:" str
        if [[ "$str" = "end" ]]
        then
             break
        fi
    done

    执行结果:

    这里写图片描述

    小结:

    1.while如何控制循环的次数?

    • 读文件时,循环次数看文件里有多少行
    • 定义变量,根据变量的值来控制
    while (( i<=10 ))

    2.while循环里,死循环的语法有哪几种?怎么跳出死循环?

    • while :
    • while true
    • while [1]

    • break
    • exit

    3.循环结束不代表脚本结束!脚本的执行是从上而下执行的!!

    练习
    每2秒钟输出一次系统时间。
    解析:不停输出–》死循环while–》sleep 2–》时间格式:年月日时分秒

    答案:

    #!/bin/bash
    while :
    do
            echo $(date +%F'  '%H:%M:%S) >>/lianxi/timeout.txt
            sleep 2
    done
    [或者:date +'%Y-%m-%d  %H%M%S']

    练习2:
    用while循环批量添加20个用户,要求:
    ①用户名称以stu开头,按数字顺序进行编号
    ②一共添加20个用户,即stu1、stu2……
    ③初始密码均设置为123456

    答案:

    #!/bin/bash
    a="stu"
    i=1
    while (( i<=20 ))
    do
         useradd $a$i
         echo "123456"|passwd --stdin $a$i &>/dev/null
         (( i++ ))
    done

    假如用户名在一个文件里,怎么解决?

    #!/bin/bash
    cat username.txt|while read name pass  --》name pass 叫啥都行
    do
        id $name &>/dev/null||useradd $name
        echo "$pass"|passwd $name --stdin &>/dev/null
    done
    (||:或符号,id命令执行不成功,才执行后面的命令)

    练习3:

    分析当前主机中所有用户,哪些是普通用户,哪些是系统用户。

    分析:
    看 passwd文件的UID,uid>500则为普通用户,uid<500则为系统用户,
    uid怎么从passwd文件里弄出来,uid>500的用户怎么弄出来,怎么嵌套进循环里。

    答案:

    #!/bin/bash
    cat /etc/passwd|tr ":" " "|while read username x uid gid --》用户名给username变量,x给x变量,uid给uid变量,其他的给gid这个变量,while取出来是一行一行的取出。
    do
        if ((uid>500))
        then
                echo "$username is general user."
        elif ((uid==0))
        then
                echo "$username is super user."
        else
                echo "$username is system user."        
        fi
    done
    (闪烁功能:#echo -e"e[5;33mHello,Worde[0m"
    而且是显示黄色,并且闪烁)

    练习:猜商品价格游戏
    猜唐僧的紫金钵价值多少~
    ①通过变量RANDOM获得价格
    ②提示用户猜测并记录次数,猜中后退出循环

    这里写图片描述
    分析:随机产生价格(1-100),给与提醒,价格高了/低了,记录猜的次数,如果猜的次数大于10次,输出you are bajie;5次,you are wukong;1次,you are rulai。并且猜中后退出循环,没有猜中就一直猜。。

    答案:

    #!/bin/bash
    time=0
    a=$((RANDOM%100))
    while :
    do
        read -p "Please input the price between 1 and 100:" price
        ((time++))
        if ((price==a))
        then
                echo "Bingo!!You guess it!"    
                echo "The time that you guess is :$time"
                break
        elif ((price>a))
        then
                echo "The $price is 高了!!"
        else
                echo "The $price is 低了!!"
        fi
    done
    if ((time==1))
    then
        echo "You are rulai!"
    elif ((time<5 && time>1))
    then
        echo "You are wukong!!"
    elif ((i<=10))
    then
        echo "You are bajie!!"
    else
        echo "You are loser..."
    fi

    练习:给登录到当前主机的所有非root用户终端发送一句话:“用户名:Hi,I’m Root!”

    答案:

    #!/bin/bash
    w|tail -n +3|while read user TTY other  --》w命令显示连接到本机的所有用户
    do
        if [[ "$user" != "root" ]]
        then
            echo "Hello $user,I am Root!" >/dev/$TTY
        fi
    done

    执行结果:
    另起一个终端,
    这里写图片描述

    shift迁移语句

    用于迁移位置变量,将 1 9 依次向左传递。
    例如,若当前脚本程序获得的位置变量如下:
    $1=file1、$2=file2、$3=file3、$4=file4

    则执行一次shift命令后,各位置变量为:
    $1=file2、$2=file3、$3=file4

    再次执行shift命令后,各位置变量为:
    $1=file3、$2=file4
    (把后面的往前挪。。相当于把前面的挨个删除了)
    其实每shift一次,$#位置变量的总数会发生变化,同时会重新排序。

    eg:

    #!/bin/bash
    while (($#>0))
    do
        echo "$ is $1"
        sleep 0.3
        shift
    done

    执行结果:
    这里写图片描述

    until语句

    until 条件为假
    do
        动作
    done

    (until条件为真时,才结束循环。与while的用法正好不同。)

    例:字符串的比较
    芝麻开门:直到说出芝麻开门才停,否则一直说“山无棱,天地合,才敢与君绝。”

    答案:

    #!/bin/bash
    until false
    do
        read -p "山无棱,天地合,才敢与君绝:" PIN
        if [[ $PIN == "open door" ]]
        then
            echo "your answer is OK!"
            break
        fi
    done

    执行结果:
    这里写图片描述


    搭建ftp服务器:

    1.安装软件
    #yum install vsftpd
    2.启动ftp服务
    #service vsftpd restart(centos6版本)
    #/bin/systemctl restart vsftpd.service(centos7版本里)
    3.查看ftp服务器的状态(在本机上执行)
    #service vsftpd status(centos6版本)
    #/bin/systemctl status vsftpd.service(centos7版本里)

    在别的机器上监控ftp服务器状态(nc命令)

    ①在监控的机器上安装nc命令
    #yum install nc
    ②在被监控的机器上关闭防火墙,允许访问21号端口
    #iptables -F
    ③#nc -z 172.16.145.188 21 –》只是扫描端口,不发送数据,所以速度快。
    若显示 succeeded!,则证明对方的ftp服务是好的。
    #echo $? –》通过返回值得到对方ftp服务是否开启
    查看端口是否开启:
    #lsof -i:21

  • 相关阅读:
    3.2.8.1 打印与否
    3.2.8 sed 的运作
    3.2.7.1 替换细节
    3.2.7 基本用法
    3.2.6 在文本文件里进行替换
    3.2.5 程序与正则表达式
    pgm2
    pgm6
    pgm7
    pgm8
  • 原文地址:https://www.cnblogs.com/lpeng94/p/12546493.html
Copyright © 2020-2023  润新知