• shell 脚本 for,while,case 语句详解及案例


    ################for循环语句的结构#############
    使用for循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。在这里,取值表 称为for语句的执行条件,其中包括多个属性相同的对象、需要预先指定(如通讯录、IP黑名单)
    ·
    语法样式
    for 变量名 in 取值列表
    do
      命令序列
    done
    ·
    #####for循环语句列子####
    需求:根据人事部门给出的员工姓名拼音列表,在Linux服务器中添加相应的用户账号,
    初始密码均设置为“123456”,其中,员工列表的账户数量不固定,不相同。
    ·
    1.编辑文本
    [root@localhost ~]# cd /opt
    [root@localhost opt]# vi users.txt
    zhang3
    li4
    wang5
    sun6
    2.编辑脚本
    ##创建多个用户
    [root@localhost opt]# vi uaddfor.sh
    #!/bin/bash
    ULIST=$(cat /opt/users.txt)
    for UNAME in $ULIST
    do
    useradd $UNAME
    echo "123456" | passwd --stdin $UNAME &>/dev/null
    done
    ·
    ##删除uaddfor.sh脚本添加的用户
    cd opt
    vi udelfor.sh
    #!/bin/bash
    ULIST=$(cat /opt/users.txt)
    for UNAME in $ULIST
    do
    userdel -r $UNAME &>/dev/null
    id $UNAME
    done
    ·
    ##IP地址检查主机状态
    [root@localhost opt]# vi ipadds.txt
    192.168.10.1 
    192.168.10.2
    192.168.10.3
    192.168.10.4
    ·
    [root@localhost opt]# vi chkhosts.sh 
    #!/bin/bash
    HLIST=$( cat /opt/ipadds.txt )
    for IP in $HLIST
    do
    ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
    if [ $? -eq 0 ]
    then
    echo "host $IP is up."
    else
    echo "host $IP is down."
    fi
    done
    [root@localhost opt]# chmod +x chkhosts.sh
    [root@localhost opt]# ./chkhosts.sh 
    host 192.168.32.1 is down.
    host 192.168.32.2 is up.
    host 192.168.32.3 is down.
    host 192.168.32.11 is up.
    ·
    #############while循环语句的结构###########
    for循环语句非常适合列表对象无规则,且列表来源固定的场合,而对于需求控制的循环次数,操作对象按数字顺序的编号,按特定的条件执行重复操作等情况,则更适合使用一种循环语句----while语句。
    while语句使用流程:首先判断while后条件测试操作结果,如果条件成立,则执行do......done循环体;返回while后,再次判断条件测试结果,如果条件仍然成立,则继续折行循环体;再次返回while后,判断条件测试结果........如此循环,直到while后的条件测试结果不在成立为止,最后跳到done语句,表示循环结束。
    whlie特点:重复测试某个条件,只要条件成立则反复执行
    ·
    语法样式
    while 条件测试操作
    do
    命令序列
    done
    ·
    #####while循环语句实例#####
    批量添加用户
    用户名称以stu开头,按数字顺序进行编号
    一共添加20个用户,即stu1、stu2、……、stu20
    初始密码均设为123456
    ·
    [root@localhost opt]# vi uaddwhile.sh
    #!/bin/bash
    PREFIX="stu"
    i=1
    while [ $i -le 20 ]
    do 
    useradd ${PREFIX}$i
    echo "123456" | passwd --stdin ${PREFIX}$i &> /dev/null
    let i++
    done
    [root@localhost opt]# chmod +x uaddwhile.sh 
    [root@localhost opt]# ./uaddwhile.sh 
    ·
    ###删除用户###
    [root@localhost opt]# cd /opt
    [root@localhost opt]# vi udelwhile.sh
    #!/bin/bash
    PERFIX="stu"
    i=1
    while [ $i -le 20 ]
    do 
    userdel -r ${PERFIX}$i
    let i++
    done 
    [root@localhost opt]# chmod +x udelwhile.sh 
    [root@localhost opt]# ./udelwhile.sh 
    ·
    ·
    ###实例2###
    猜商品价格游戏
    通过变量RANDOM获得随机数
    提示用户猜测并记录次数,猜中后退出循环
    ·
    [root@localhost opt]# vi pricegame.sh
    #!/bin/bash
    PRICE=$(expr $RANDOM % 1000)
    TIMES=0
    echo "商品的实际价格范围0-999,猜猜看是多少"
    while true
    do
    read -p "请输入你猜猜的价格数目:" INT
    let TIMES++
    if [ $INT -eq $PRICE ] ; then
    echo "恭喜你答对了,实际价格是 $PRICE"
    echo "您总共猜对了 $TIMES 次"
    exit 0
    elif [ $INT -gt $PRICE ] ; then
    echo "太高了!"
    else
    echo "太低了!"
    fi
    done
    ·
    ###解释###
    1、while true 是代表无限循环下去
    2、$RANDOM是Bash的内部函数,随机取值范围在0 - 32767之间
    ·
    [root@localhost opt]# chmod +x pricegame.sh 
    [root@localhost opt]# ./pricegame.sh 
    商品的实际价格范围0-999,猜猜看是多少
    请输入你猜猜的价格数目:900
    太高了!
    请输入你猜猜的价格数目:800
    太高了!

    请输入你猜猜的价格数目:325
    恭喜你答对了,实际价格是 325
    您总共猜对了 13 次
    ·
    #############case分支语句的结构#############
    针对变量的不同取值,分别执行不同的命令序列 
    ·
    ###语法样式
    case 变量值 in
    模式1)
    命令序列1
    ;;
    模式2)
    命令序列2
    ;;
     ……
    )
    默认命令序列
    esac
    ·
    ###case使用特点
    ·
    case行尾必须为单词"in",每一模式必须以")"结束
    双分号";;" 表示命令序列结束
    模式字符串中,可以用方括号表示已个连续的范围,如"[0-9]";还可以用竖杠符号"|"表示,如"A|B"
    最后的"
    " 表示默认模式,其中的相当于通配符。
    ·
    ###示例1
    击键类型识别
    提示用户输入一个字符
    判断出该字符是字母、数字或者其他字符
    ·
    vi hitkey.sh
    #!/bin/bash
    read -p "请输入一个字符,并Enter键确认:" KEY
    case "$KEY" in
    [a-z] | [A-Z])
    echo "您输入的是 字母."
    ;; 
    [0-9])
    echo "您输入的是 数字."
    ;;

    echo "您输入的是 空格、功能键或者是其他控制字符."
    esac
    ·
    [root@localhost opt]# chmod +x hitkey.sh 
    [root@localhost opt]# ./hitkey.sh 
    请输入一个字符,并Enter键确认:A
    您输入的是 字母.
    [root@localhost opt]# ./hitkey.sh 
    请输入一个字符,并Enter键确认:a
    您输入的是 字母.
    [root@localhost opt]# ./hitkey.sh 
    请输入一个字符,并Enter键确认:1
    您输入的是 数字.
    [root@localhost opt]# ./hitkey.sh 
    请输入一个字符,并Enter键确认:
    您输入的是 空格、功能键或者是其他控制字符.

  • 相关阅读:
    LeetCode——面试题57
    翻译——5_Summary, Conclusion and Discussion
    LeetCode——114. 二叉树展开为链表
    LeetCode——1103. 分糖果 II
    LeetCode——337. 打家劫舍 III
    LeetCode——994. 腐烂的橘子
    Python——潜在会员用户预测
    Vue中div高度自适应
    webpack中使用vue-resource
    Mint UI组件库 和 Mui
  • 原文地址:https://www.cnblogs.com/canflyfish/p/11449200.html
Copyright © 2020-2023  润新知