while 循环:条件测试成功则循环,失败则退出。

until 循环:条件测试成功则退出,失败则循环,和while刚好相反。

条件测试

    1、执行命令:命令执行成功,则条件测试成功,否则为失败。

    2、测试表达式:

                [ expression ]

                ` expression `

                test expression


while 循环格式

while 条件测试; do
    循环体
done

while如何退出循环?

    当条件测试不成功时就会退出循环,所以可以在循环体中改变测试条件中用于控制循环次数的变量的值;


while 死循环

while true;
do
    echo "执行的语句"
done

while ((1));  ## ((1))也可以写成[1]
do
    echo "执行的语句"
done



练习:

    1、求100以内所有正整数的和;

#!/bin/bash
#
declare -i i=1
declare -i sum=0

while  [ $i -le 100 ];do
        let sum=$sum+$i
        let i++
done
echo "this sum is: $sum"


2、求100以内所有偶数之和

#!/bin/bash
#
declare -i evensum=0
declare -i i=2

while [ $i -le 100 ];do
        evensum=$[$evensum+$i]
        let i+=2
done
echo "evensum is: $evensum"

或使用if语句在中间判断,但执行效率会低一点。

#!/bin/bash
#
declare -i evensum=0
declare -i i=1

while [ $i -le 100 ];do
        [ $[$i%2] -eq 0 ] && evensum=$[$evensum+$i]
         let i++
done
echo "evensum is: $evensum"

declare -i evenSum=0
declare -i i=1

while [ $i -le 100 ]; do
    if [ $[$i%2] -eq 0 ]; then
        let evenSum+=$i
    fi
    let i++
done

echo $evenSum


3、通过键盘提示用户输入字符,将用户输入的小写字母转换为大写,转换一次之后,再次提醒,再输再转换;但输入quit表示退出;

#!/bin/bash
#
read -p "Plz enter world: " world

while ! [ "$world" == "quit" ];do
        world=`echo $world |tr 'a-z' 'A-Z'`
        echo $world
        read -p "Plz Enter World Again: " world
done



4、显示如下菜单给用户
    cpu) print cpu information;
    mem) print memory information;
    disk) print disk infomation;
    quit) quit
    Enter your option:

    根据用户的选择输出相应信息;
        每次执行后,不退出,而由用户再次指定新的选项;

#!/bin/bash
#
cat << EOF
 CPU) print cpu infomation;
 MEM) print memory infomation;
 DISK) print disk infomation;
 QUIT) exit menu.
EOF
read -p "PLZ select option: " option
 option=`echo "$option" | tr 'A-Z' 'a-z'`
while ! [[ "$option" == "quit" ]];do
        if [[ "$option" == "cpu" ]];then
                cat /proc/cpuinfo
        elif [[ "$option" == "mem" ]];then
                free -m
        elif [[ "$option" == "disk" ]];then
                df -h
        else
            echo "error option"
        fi
read -p "PLZ select option agian: " option
 option=`echo "$option" | tr 'A-Z' 'a-z'`
done

或中间使用case来替换if

#!/bin/bash
#
cat << EOF
 CPU) print cpu infomation;
 MEM) print memory infomation;
 DISK) print disk infomation;
 QUIT) exit menu.
EOF
read -p "PLZ select option: " option
 option=`echo "$option" | tr 'A-Z' 'a-z'`
while ! [[ "$option" == "quit" ]];do
  case $option in
        cpu)
            cat /proc/cpuinfo
                ;;
        mem)
            free -m
                ;;
        disk)
            df -h
                ;;
        *)
            echo "error option"
                ;;
  esac
read -p "PLZ select option agian: " option
 option=`echo "$option" | tr 'A-Z' 'a-z'`
done


5、提示用户输入一个用户名,如果存在:显示用户UID和SHELL信息;否则,则显示无此用户;
      显示完成之后,提示用户再次输入;如果是quit则退出;

!#/bin/bash
#
read -p "Please Enter a userName: " UserName

while [[ "$UserName" != "quit" ]];do
        if [ -z $UserName ];then
                echo "UserName Null."
        elif id $UserName &> /dev/null;then
                grep "^$UserName\>" /etc/passwd | cut -d: -f3,7
        else
                echo "error userName not exsi."
        fi
read -p "Please Enter a userName Again: " UserName
done
~


6、提示用户输入一个用户名,判断用户是否登录了当前系统;
    如果没有登录,则停止5秒钟之后,再次判断;直到用户登录系统,显示“用户来了”,而后退出;

#!/bin/bash
#
read -p "Pleases Enter UserName: " UserName
while [ -z "$UserName" ] || ! id $UserName >& /dev/null;do
        read -p "Pleases Enter UserName: " UserName
done

        who | grep "^$UserName\>" >& /dev/null
        returnvalue=$?
  while ! [ $returnvalue -eq 0 ];do
        echo "user not here."
        sleep 5
        who | grep "^$UserName\>" >& /dev/null
        returnvalue=$?
        
  done
echo "$UserName come"

#!/bin/bash
#
read -p "Enter a user name: " userName

while [ -z "$UserName" ] || ! id $UserName >& /dev/null;do
        read -p "Pleases Enter UserName: " UserName
done

while ! who | grep "^$userName" &> /dev/null; do
        echo "$userName is not here."
        sleep 5
done

echo "$userName is on."


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

until循环

格式:

until 测试条件; do
    循环体
done

条件不满足,则循环;否则,退出;

练习

1、用until循环,求100以内所有正整数之和;

#!/bin/bash
#
declare -i sum=0
declare -i i=1

until [ $i -gt 100 ];do
        sum=$[$sum+$i]
        let i++
done
        echo "$sum"

2、提示用户输入一个用户名,判断用户是否登录了当前系统;
    如果没有登录,则停止5秒钟之后,再次判断;直到用户登录系统,显示“用户来了”,而后退出;

#!/bin/bash
#
read -p "pleases enter userName: " UserName
        until [ -n "$UserName" ] && id $UserName >& /dev/null;do
                read -p "pleases enter userName: " UserName
        done

until  who | grep "^$UserName\>" >& /dev/null;do
        echo "user not here!!!"
        sleep 5
done
        echo "$UserName come."