實現一個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編程藝術,僅做我的筆記使用,如侵權請聯繫刪除