2. while 命令

while 命令用户创建一个循环运行一组命令(命令块)的结构,会根据执行 测试命令 的测试结果(即退出状态)来决定是否重复执行 命令块。如果测试结果为真则继续执行命令块,当测试结果为假(即退出状态为非零值)时终止循环。

官方语法

while COMMANDS; do COMMANDS-2; done

COMMANDS 后面的分号 ; 表示 命令的终止符,如果后面 do 写在新的一行内,则 分号; 可以省略。

将上述一行整理成多行,并用中文表达需要填充的部分,即成为如下语法:

语法格式:

while 测试命令; do
    命令块;
done

while 测试命令
do
    命令块;
done

语法说明:

while命令执行过程说明:

  1. 先执行测试命令,根据测试命令的退出状态来决定是否执行命令块。
  2. 如果测试命令的退出状态为假值(非零值)则直接退出此 while 命令,while 循环执行结束。
  3. 如果测试命令的退出状态为真值(零 0)则执行命令块部分的命令。然后回到第一步,再执行测试命令。

示例:

循环打印 1 到 10 的整数。每一行打印一个数字。

写一个 Shell 程序 test_while.sh,内容如下:

#!/bin/bash

count=1

while [ $count -le 10 ]
do
    echo "$count"
    count=$(expr $count + 1)
done

运行结果

weimingze@mzstudio:~$ bash test_while.sh
1
2
3
4
5
6
7
8
9
10

示例2:

循环读取键盘输入的内容。当直接回车时结束输入,打印输入文字的行数并打印每一行输入的内容。

编写一个 Shell 程序 test_while2.sh,内容如下:

#!/bin/bash

count=0
content=""

while read -p '请输入一行文字,直接回车结束输入: ' line && [ `expr length "$line"` -ne 0 ]
do
    count=$(expr $count + 1)
    content=${content}${line}
done
echo "你输入了 $count 行文字!"
echo "内容是:" $content

运行结果:

weimingze@mzstudio:~$ bash test_while2.sh
请输入一行文字,直接回车结束输入: hello shell
请输入一行文字,直接回车结束输入: bye
请输入一行文字,直接回车结束输入:
你输入了 2 行文字!
内容是: hello shellbye

退出状态

while 命令的退出状态是内部最后执行的一条命令的退出状态。

练习:

$ source sum_m2n.sh
please input begin number:
1
please input end number:
100
RESULT: 5050