• bash while/until循环学习


    while循环:条件满足,则循环;失败,则退出

     如何退出?

       必须有时刻,条件测试不成功

         ? :条件控制变量


    while 条件测试:do

      循环体

    done


    until循环;条件不满足,则循环;否则,退出

      until 测试条件;do

        循环体

      done


    bash编程之组合测试条件

      逻辑与:多个条件同时满足

        [ CONDITION1 ] && [ CONDITION2 ]

        [ CONDITION1 -a CONDITION2 ]

        [[ CONDITION1 && CONDITION2 ]]

        注意:前两个使用单双中括号都可,但&&不允许用于单个中括号中,所有第三者只能用于双中括号中

      逻辑或:多个条件满足一个

        [ CONDITION1 ] || [ CONDITION2 ]

        [ CONDITION1 -o CONDITION2 ]

        [[ CONDITION1 || CONDITION2 ]]

      注意 || 不允许出现在单中括号中


      得摩根定律

        !(条件1或者 条件2) = !条件1 并且!条件2

        !(条件1且条件2)=!条件1 或者 !条件2


    练习:

    1.:通过键盘提示用户输入字符,将用户输入的小写字母转换为大写,转换一次之后,在此提醒,再输入再转换,直到输入quit退出;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #! /bin/bash
    #
     
    read -p -t 5 "Enter a Word: " word
     
    while [[ "$word" != "quit" ]]; do
      echo $word | tr 'a-z' 'A-Z'
      read -p -t 5 "Enter a Word again: " word
    done

    2.写一个脚本,实现如下功能;

      1、显示如下菜单:

        CPU) show cpu info;

        men) show memory info;

        disk) show disk info;

        quit) quit

        Enter your option:

      2、根据用户的选择输出相应信息,每次执行后,不退出,而由用户咋此指定新的选项

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #! /bin/bash
    #
    cat <<EOF
        cpu) print cpu infomation
        men) print memory infomation
        disk) print disk infomation    
        quit) Quit
    EOF
     
    read -p "Enter your option: " option
    option=`echo $option | tr 'a-z' 'A-Z'`
     
    while [[ "$option" != "QUIT" ]]; do
      if [[ "$option" == "CPU" ]]; then
        cat /proc/cpuinfo
      elif [[ "$option" == "MEM" ]]; then
        free -m
      elif [[ "$option" == "DISK" ]]; then
        df -Th
      else
        echo "Wrong Option..."
      fi
       
      read -p "Enter your option: " option
      option=`echo $option | tr 'a-z' 'A-Z'`
    done

    3.提示用户输入一个用户名,显示用户名UID和SHELl信息,否则,则显示无此用户,显示完成后,提示用户再次输入,如果quit则退出;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #! /bin/bash
    #
    cat <<EOF
      Username)Enter your Username..
      quit)quit..
    EOF
     
    read -p "Enter Your userName: " userName
    userName=`echo $userName | tr 'A-Z' 'a-z'`
     
    while [[ "$userName" != "QUIT" ]]; do
      sysUser=`cat /etc/passwd | grep  ^$userName | cut -d: -f1 | tr 'A-Z' 'a-z'`
      if [[ "$userName" == "$sysUser" ]]; then
        echo "This $userName `cat /etc/passwd | grep -i ^$userName | cut -d: -f3,7`"
      else
        echo "No Such $userName.."
      fi
      read -p "Enter Your userName: " userName
      userName=`echo $userName | tr 'A-Z' 'a-z'`
    done
     
    #! /bin/bash
    #
     
    read -t 2 -p "Enter a user name: " userName
    userName=`echo $userName | tr 'A-Z' 'a-z'`
    UID=`grep "^$userName>" /etc/passwd | cut -d: -f3`
    SH=`grep "^$userName>" /etc/passwd | cut -d: -f7`
     
    while [[ "$userName" != "quit" ]]; do
      if [ -z "$userName" ]; then
        echo "Username null...."
      elif id $userName &> /dev/null; then
        echo "$userName uid: $UID"
        echo "$userName Shell: $SH"
      else
        echo "No such user...."
      fi
      read -t 2 -p "Enter a user name again(quit to exit) " userName
    done

    4.求100以内所有正整数的和;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #! /bin/bash
    #
    declare -i sum=0
    declare -i i=1
     
    while [ $i -le 100 ];do
        let sum+=$i
        let i++
    done
    echo $sum
     
    #! /bin/bash
    #
    declare -i sum=0
    declare -i i=1
     
    until [ $i -gt 100 ]; do
            let sum+=$i
            let i++
    done
     
    echo $sum

    5.求100以内所有偶数之和;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #! /bin/bash
    #
     
    declare -i evensum=0
    declare -i i=1
     
    while [ $i -le 100 ]; do
      if [ $[$i%2] -eq 0 ]; then
        let evensum+=$i
      fi
      let i++
    done
    echo $evensum
     
    #! /bin/bash
    #
     
    declare -i sum=0
    declare -i i=0
     
    while [[ $i -le 100 ]]; do
      let sum+=$i
      let i+=2
    done
     
    echo $sum

    6.用until求100以内整数之和;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #! /bin/bash
    #
    declare -i sum=0
    declare -i i=1
     
    until [ $i -gt 100 ]; do
      let sum+=$i
      let i++
    done
     
    echo $sum

    7.提供一个用户名,判断用户是否登陆当前系统;

      1.如果没有登陆,则停止5秒之后再次判断,直到用户登录系统,显示用户登录,而后退出

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
      #! /bin/bash
      #
      read -t 5 -p "Enter Your userName: " userName
      userName=`echo $userName | tr 'A-Z' 'a-z'`
     
      who | grep "$userName" &> /dev/null
      retVal=$?
     
      while [ $retVal -ne 0 ]; do
        sleep 5
        read -t 5 -p "Enter Your userName: " userName
        userName=`echo $userName | tr 'A-Z' 'a-z'`
      done
      echo "Welcome $userName login System..."
     
      #! /bin/bash
      #
      read -t 5 -p "Enter Your userName: " userName
     
      while ! id $userName &> /dev/null; do
        read -t 5 -p "Enter Your userName: " userName
      done
     
      who | grep "^$userName" &> /dev/null
      retVal=$?
     
      while [ $retVal -ne 0 ]; do
        sleep 5
        who | grep "$userName" &> /dev/null
        retVal=$?
      done
      echo "Welcome $userName login System..."
     
      #! /bin/bash
      #
      read -t 5 -p "Enter Your userName: " userName
     
      while ! id $userName &> /dev/null; do
        read -t 5 -p "Enter Your userName again: " userName
      done
     
      while ! who | grep "^$userName" &> /dev/null; do
        sleep 5
      done
      echo "Welcome $userName login System..."
     
      #! /bin/bash
    #
    read -t 5 -p "Enter Your userName: " userName
     
    until [ -n "$userName" ] && id $userName &> /dev/null ; do
      read -t 5 -p "Enter Your userName again: " userName
    done
     
    until who | grep "^$userName" &> /dev/null; do
      sleep 5
    done
    echo "Welcome $userName login System..."

    8.取出当前系统上,默认shell为bash的用户;

    1
    2
    3
    4
    5
    #! /bin/bash
    #
    while read line; do
      [[ `echo $line | cut -d: -f7` == "/bin/bash" ]] && echo $line | cut -d: -f1
    done < /etc/passwd

    9.显示其ID号为偶数的用户;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #! /bin/bash
    #
    while read line; do
      userID=`echo $line | cut -d: -f3`
      if [ $[$userID%2] -eq 0 ]; then
        echo -n "$userID: "
        echo $line | cut -d: -f1
      fi
    done < /etc/passwd

    10.显示/etc/rc.d/rc.sysinit文件中,其总字符个数大于30的行;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #! /bin/bash
    #
    while read line; do
      charCounts=`echo $line | wc -c`
      if [ $charCounts -gt 30 ]; then
        echo -n "$charCounts: "
        echo $line
      fi
    done < /etc/rc.d/rc.sysinit

    11.显示用户其UID和GID均为偶数的用户;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #! /bin/bash
    #
    while read line; do
      userID=`echo $line | cut -d: -f3`
      groupID`echo $line | cut -d: -f4`
      if [ $[$userID%2] -eq 0 -a $[$groupID%2] -eq 0 ]; then
        echo -n "$userID,$groupID: "
        echo $line | cut -d: -f1
      fi
    done < /etc/passwd

    12.显示/etc/rc.d/rc.sysinit文件中,其总字符个数大于30且以非#开头的行;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #! /bin/bash
    #
    while read line; do
      charCounts=`echo $line | wc -c`
      if [ $charCounts -gt 30 ] && [["$line" =~ ^[^#] ]]; then
        echo -n "$charCounts: "
        echo $line
      fi
    done < /etc/rc.d/rc.sysinit

    13.写一个脚本,完成如下任务;

      1.提示用户输入一个磁盘设备文件路径不存在或不是一个块设备,则提示用户重新输入,知道输入正确为止,或者输入quit以9为退出码结束脚本

      2.提示用户"下面的操作会清空磁盘的数据,并提问是否继续"

       如果用户给出字符y或yes,则继续,否则,则提供以8为退出码结束脚本

      3.将用户指定的磁盘上的分区清空,而后创建两个分区,大小分别为100M和512M

      4.格式化这两个分区

      5.将第一个分区挂载至/mnt/boot目录,第二个分区挂载至/mnt/sysroot目录








  • 相关阅读:
    sql server支持gb18030里面的疑难中文字
    sql:把多列的数据转成行的一个字段
    CVS转SVN
    关于linux语言的设置
    [转]Windows server 2008网络负载均衡集群
    Get和Post、幂等、净荷
    EA经典教程
    Emeditor 斜线显示为人民币符号
    map和set(关于iterator失效的问题)
    scoket和浏览器的连接限制
  • 原文地址:https://www.cnblogs.com/Saviorsyang/p/5744587.html
Copyright © 2020-2023  润新知