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."
转载于:https://blog.51cto.com/zkxfoo/1750802