本文链接:    (转载请注明出处)

用途说明

while循环是Shell中常用的语法结构,它与其他编程语言中的while有些类似,只是写法有些不一样罢了。

常用格式

格式一

while 条件;

do

   语句

done

格式二 死循环

while true

do

   语句

done

格式三 死循环

while :

do

   语句

done

格式四 死循环

while [ 1 ]

do

   语句

done

格式五 死循环

while [ 0 ]

do

   语句

done

使用示例

示例一

Bash代码
  1. COUNTER=0

  2. while [  $COUNTER -lt 10 ]; do  

  3.    echo The counter is $COUNTER  

  4.    let COUNTER=COUNTER+1

  5. done  

COUNTER=0while [  $COUNTER -lt 10 ]; do    echo The counter is $COUNTER    let COUNTER=COUNTER+1 done

[root@jfht ~]# COUNTER=0

[root@jfht ~]# while [  $COUNTER -lt 10 ]; do
>     echo The counter is $COUNTER
>     let COUNTER=COUNTER+1
> done
The counter is 0
The counter is 1
The counter is 2
The counter is 3
The counter is 4
The counter is 5
The counter is 6
The counter is 7
The counter is 8
The counter is 9
[root@jfht ~]#

这个while循环改用for循环更好些

Bash代码
  1. for ((COUNTER=0; COUNTER<10; ++COUNTER))  

  2. do  

  3.    echo The counter is $COUNTER  

  4. done  

for ((COUNTER=0; COUNTER<10; ++COUNTER))do    echo The counter is $COUNTERdone

[root@jfht ~]# for ((COUNTER=0; COUNTER<10; ++COUNTER))

> do
>     echo The counter is $COUNTER
> done
The counter is 0
The counter is 1
The counter is 2
The counter is 3
The counter is 4
The counter is 5
The counter is 6
The counter is 7
The counter is 8
The counter is 9
[root@jfht ~]#

示例二

Bash代码
  1. while true  

  2. do  

  3.    date  

  4.    sleep 1

  5. done  

while truedo    date    sleep 1done

[root@jfht ~]# while true

> do
>     date
>     sleep 1
> done
2010年 10月 10日 星期日 16:35:22 CST
2010年 10月 10日 星期日 16:35:23 CST
2010年 10月 10日 星期日 16:35:24 CST
2010年 10月 10日 星期日 16:35:25 CST
2010年 10月 10日 星期日 16:35:26 CST
2010年 10月 10日 星期日 16:35:27 CST
Ctrl+C
[root@jfht ~]#

示例三 读取输入

Java代码
  1. while read line  

  2. do

  3.    echo $line  

  4. done  

while read linedo    echo $linedone

[root@jfht ~]# while read line

> do
>     echo $line
> done
hello
hello
world
worldCtrl+D
[root@jfht ~]#

实例四 处理命令行参数

文件 while_4.sh

Bash代码
  1. #!/bin/sh  

  2. usage()  

  3. {  

  4.    echo "usage: $0 [-a] [-e <admin>] [-f <serverfile>] [-h] [-d <domain>] [-s <whois_server>] [-q] [-x <warndays>]"

  5. }  

  6. while getopts ae:f:hd:s:qx: option  

  7. do  

  8.        case "${option}" in  

  9.                a) ALARM="TRUE";;  

  10.                e) ADMIN=${OPTARG};;  

  11.                d) DOMAIN=${OPTARG};;  

  12.                f) SERVERFILE=$OPTARG;;  

  13.                s) WHOIS_SERVER=$OPTARG;;  

  14.                q) QUIET="TRUE";;  

  15.                x) WARNDAYS=$OPTARG;;  

  16.                \?) usage; exit 1;;  

  17.        esac  

  18. done  

  19. echo "ALARM=$ALARM"

  20. echo "ADMIN=$ADMIN"

#!/bin/shusage(){    echo "usage: $0 [-a] [-e 
] [-f
] [-h] [-d
] [-s
] [-q] [-x
]"}while getopts ae:f:hd:s:qx: optiondo case "${option}" in a) ALARM="TRUE";; e) ADMIN=${OPTARG};; d) DOMAIN=${OPTARG};; f) SERVERFILE=$OPTARG;; s) WHOIS_SERVER=$OPTARG;; q) QUIET="TRUE";; x) WARNDAYS=$OPTARG;; \?) usage; exit 1;; esacdoneecho "ALARM=$ALARM"echo "ADMIN=$ADMIN"

[root@jfht ~]# cat while_4.sh

#!/bin/sh
usage()
{
   echo "usage: $0 [-a] [-e <admin>] [-f <serverfile>] [-h] [-d <domain>] [-s <whois_server>] [-q] [-x <warndays>]"
}
while getopts ae:f:hd:s:qx: option
do
       case "${option}" in
               a) ALARM="TRUE";;
               e) ADMIN=${OPTARG};;
               d) DOMAIN=${OPTARG};;
               f) SERVERFILE=$OPTARG;;
               s) WHOIS_SERVER=$OPTARG;;
               q) QUIET="TRUE";;
               x) WARNDAYS=$OPTARG;;
               \?) usage; exit 1;;
       esac
done
echo "ALARM=$ALARM"
echo "ADMIN=$ADMIN"
[root@jfht ~]# chmod +x while_4.sh
[root@jfht ~]# ./while_4.sh
ALARM=
ADMIN=
[root@jfht ~]# ./while_4.sh -a
ALARM=TRUE
ADMIN=
[root@jfht ~]# ./while_4.sh -e hy
ALARM=
ADMIN=hy
[root@jfht ~]#

问题思考

1. 为什么 while [ 0 ] 也会是死循环?

2. 怎么使用while read line从文件中读入数据?

相关资料

【1】BASH Programming - Introduction HOW-TO

【2】Audbel

【3】一个有很多while示例的英文网页