实现一个shell脚本,不停地询问用户要执行什么操作,直到用户输入quit才会退出,否则脚本一直这样运行下去。我们直到while循环是在测试条件满足的情况下执行循环体,一直到条件不满足时终止循环,如果我们需要的循环是在测试条件不满足的情况下执行循环体,而当测试条件满足以后就停止并结束循环。

解决方案:

 当然只要对测试条件进行修改,我们就还是可以使用while来实现这样的需求。不过bash为我们提供了更适合这种情况的语句:until语句

#!/bin/bash
QUIT_COMMAND=quit
#直到用户输入的字符串是quit时,until循环才会退出
until [ "$USER_INPUT" = "$QUIT_COMMAND" ]
do
   echo "Please input command"
   echo "(type command $QUIT_COMMAND to exit)"
   read USER_INPUT
   echo
   echo ">>your command is $USER_INPUT"
   
   #对用户的输入进行匹配
   case $USER_INPUT IN
       "open")
               echo ">>opening..."
               ;;
       "close")
               echo ">>closed"
               ;;
        *)
               echo ">>Unknown command"
               ;;
   esac
   echo
   done
   echo "Bye."
   exit 0


在bash手册中,until的语法和while语句的语法一样,都是在循环的前面先测试一个条件,以此来决定是否要执后面的循环体。

如果把do和条件测试放到同一行,则两者中间需要用分号;分隔。即

until xxx;do xxxx;done

如果把都和条件测试分别放到不同行,则可以省略分号。即

until  xxx
do
xxx
done

在测试命令[]中,这里使用了=来比较两个字符串是否相等。在条件表达式中比较两个整数的大小关系与比较两个字符串是否相等,使用的是不同的操作符。其他字符串的操作符还有:

  -n STRING                              #字符串长度如果为非0则返回真
   -z STRING                              #字符串长度如果为0 则返回真
   STRING1 = STRING2             #两个字符串相同则返回真
   STRING1! = STRING2            #两个字符串不相同则返回真

只有当用户输入的命令为“quit”时,until后面的条件测试[ "$USER_INPUT" =  “$QUIT_COMMAND”]

为真,循环结束。


拓展练习:

使用until循环写一个脚本,测试192.168.1.30--192.168.1.130区间的网段是否在线。

#!/bin/bash
NETWORK=192.168.1
IP=30
#也可以写成until [ ! "$IP" -lt 130 ]
until [ "$IP" -ge 130 ]
do
      echo -en "Testing machine at IP address:${NETWORK}.${IP}..."
      ping -c1 -w1 ${NETWORK}.${IP} > /dev/null 2>&1 
      #-c是指ping的次数,-w是指执行的最后期限,也就是执行的时间,单位为秒
      #将标准输出或者错误输出的定向到/dev/null
      if [ "$?" -eq 0 ]   
      #$?上一条命令执行后返回的状态
      then
              echo "OK"
       else
               echo "Failed"
       fi
       let IP=$ip+1
done

提示:

  1. shell内建的测试命令[ 和 ] 的两侧需要空格

  2. 在测试命令[]中,使用-eq来比较两个字符串是否相等,比较两个整数的大小关系,以及比较两个字符串是否相等,使用的是不同的操作符

  3. bash中的until条件测试应该下载循环体的上部,和某些语言中的until不同


    ---------------脚本来源于shell编程艺术,仅作个人笔记使用,如侵权请联系删除