一、while的语法格式

二、until的语法格式

三、示例与练习

四、补充

 

一、while的语法格式

------------------------------------------

while 测试条件; do   

    语句1

    语句2

    ······

done

------------------------------------------

条件满足时就循环,直到条件不满足,则退出循环

退出循环的方法之一:在循环体中改变测试条件相应变量的值,如示例1中,$I的值大于100则退出循环

 

常用于遍历文件每一行内容,如示例3

while read LINE; do

    语句1

    语句2

    ······

done < /path/to/somefile

 

二、until的语法格式

------------------------------------------

until 测试条件;do

    语句1

    语句2

    ······

done

------------------------------------------

条件不满足就循环,直到满足时退出循环,例如示例5,直到I大于100时,退出循环

 

三、示例与练习

 

示例1:计算100以内所有正整数的和

#!/bin/bash
#
Sum=0    #如果希望变量中存储的值为整数型,最好使用let Sum=0或declare -i Sum=0这种形式
I=1
while [ $I -le 100 ];do
    let Sum+=$I    #算术运算写成这种格式要注意不要漏掉let
    let I++    #算术运算写成这种格式要注意不要漏掉let
done
echo "Sum:$Sum"

 

示例2:计算100以内所有偶数的和

#!/bin/bash
#
EvenSum=0    #如果希望变量中存储的值为整数型,最好使用let EvenSum=0或declare -i EvenSum=0这种形式
I=0
while [ $I -le 100 ]; do
    let EvenSum+=$I
    let I++
    let I++
done
echo "EvenSum:$EvenSum"

或
#!/bin/bash
#
EvenSum=0
I=0
while [ $I -le 100 ]; do
    if [ $[$I%2] -eq 0 ]; then    #除二取余为0时
        let EvenSum+=$I
    fi
    let I++
done

示例3:如果用户的ID号为偶数,则显示其名称和shell;对所有用户执行此操作

#!/bin/bash
#
while read Line; do
    Uid=`echo $Line | cut -d: -f3`
    if [ $[$Uid%2] -eq 0 ]; then    #除二取余为0时
        echo $Line | cut -d: -f3,7
    fi
done < /etc/passwd    #此时while语句实现了一行一行遍历整个文件内容

 

示例4:转换用户输入的字符为大写,输入quit时则退出

#!/bin/bash
#
read -p "A string [quit for quiting]:" String    
    while  [ "$String" != quit ]; do    #一定要用双引号,字符串有空格时会报错
    echo $String | tr 'a-z' 'A-Z'
    read -p "Next String [quit for quiting]:" String
done


示例5:计算100以内所有正整数的和

#!/bin/bash
#
Sum=0
I=1
until [ $I -gt 100 ]; do    #直到I的值大于100才退出
    let Sum+=$I
    let I++
done
echo "Sum:$Sum"

 

示例6:每隔5秒查看hadoop用户是否登录,如果登录,显示其登录并退出;否则,显示当前时间,并说明hadoop尚未登录(while 简写)

#!/bin/bash
#
until who | grep "^hadoop" &> /dev/null; do
    date
    sleep 5
done
echo "hadoop is logged in."

或

#!/bin/bash
#
who | grep "^hadoop" &> /dev/null
Ret=$?
until [ $Ret -eq 0 ]; do    #grep匹配到时,命令执行状态返回值是0,未匹配到则是非0    date
    sleep 5
done
echo "hadoop is logged in."

或

#!/bin/bash
#
who | grep "^hadoop" &> /dev/null
Ret=$?
while [ $Ret -ne 0 ]; do
    date
    sleep 5
    who | grep "^hadoop" &> /dev/null 
    Ret=$?    #再次取得命令执行状态的返回值 
done
echo "hadoop is logged in."

 

练习1:写一个脚本:  
1) 显示一个菜单给用户:  
d|D) show disk usages.  
m|M) show memory usages.  
s|S) show swap usages.  
*) quit.       
2) 当用户选择完成,显示相应信息后,不退出;而让用户再一次选择,再次显示相应内容;除了用户使用quit

#!/bin/bash
# Date: 2015-04-20
# Author: ArvinLau
# Description: 
# Version: 1.0
cat << EOF    
d|D) show disk usages.
m|M) show memory usages.
s|S) show swap usages.
*) quit.
EOF
Ret=0    #自定义退出的命令执行状态返回值,通过until语句的直到满足条件,否则一直循环完成练习
until [ "$Ret" -eq 9 ];do
    read -p "Give a choice:" Choice
    case $Choice in
    d|D)
        df -lh;;
    m|M)
        free -m;;
    s|S)
        cat /proc/swaps;;
    quit)
        echo "Quit."
        exit 9;;    #自定义命令执行状态返回值
    *)
        echo -n "Invalid input,";;
    esac
    Ret=$?    #只要不是自定义的9,就会不断循环
done

或

#!/bin/bash
# Date: 2015-04-20
# Author: ArvinLau
# Description: 
# Version: 1.0
cat << EOF    
d|D) show disk usages.
m|M) show memory usages.
s|S) show swap usages.
*) quit.
EOF

until [ "$Choice" == quit ];do    #当变量字符串是quit时,退出循环  
read -p "Give a chioce:" Choice   
    case $Choice in
    d|D)
        df -lh;;
    m|M)
        free -m;;
    s|S)
        cat /proc/swaps;;
    quit)
        echo "Quit."
        exit 9;;
    *)
        echo -n "Invalid input,";;
    esac
done

四、算术运算符

下面每行的运算表达式,运算结果都相同

Sum=$[$Sum+$M]            let Sum+=$M          

------------------------------------------

Sum=$[$Sum+1]             let Sum+=1           let Sum++    #变量自身+1

------------------------------------------

Sum=$[$Sum-$M]            let Sum-=$M

------------------------------------------

Sum=$[$Sum*$M]            let Sum*=$M

------------------------------------------

Sum=$[$Sum/$M]            let Sum/=$M

------------------------------------------

Sum=$[$Sum%$M]            let Sum%=$M