实现一个shell脚本,不停地询问用户要执行什么操做,直到用户输入quit才会退出,不然脚本一直这样运行下去。咱们直到while循环是在测试条件知足的状况下执行循环体,一直到条件不知足时终止循环,若是咱们须要的循环是在测试条件不知足的状况下执行循环体,而当测试条件知足之后就中止并结束循环。shell
解决方案:编程
固然只要对测试条件进行修改,咱们就仍是可使用while来实现这样的需求。不过bash为咱们提供了更适合这种状况的语句:until语句bash
#!/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语句的语法同样,都是在循环的前面先测试一个条件,以此来决定是否要执后面的循环体。ide
若是把do和条件测试放到同一行,则二者中间须要用分号;分隔。即测试
until xxx;do xxxx;done
若是把都和条件测试分别放到不一样行,则能够省略分号。即ui
until xxx do xxx done
在测试命令[]中,这里使用了=来比较两个字符串是否相等。在条件表达式中比较两个整数的大小关系与比较两个字符串是否相等,使用的是不一样的操做符。其余字符串的操做符还有:spa
-n STRING #字符串长度若是为非0则返回真 -z STRING #字符串长度若是为0 则返回真 STRING1 = STRING2 #两个字符串相同则返回真 STRING1! = STRING2 #两个字符串不相同则返回真
只有当用户输入的命令为“quit”时,until后面的条件测试[ "$USER_INPUT" = “$QUIT_COMMAND”]
ip
为真,循环结束。ci
拓展练习:字符串
使用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
提示:
shell内建的测试命令[ 和 ] 的两侧须要空格
在测试命令[]中,使用-eq来比较两个字符串是否相等,比较两个整数的大小关系,以及比较两个字符串是否相等,使用的是不一样的操做符
bash中的until条件测试应该下载循环体的上部,和某些语言中的until不一样
---------------脚原本源于shell编程艺术,仅做我的笔记使用,如侵权请联系删除