Linux之while、until语句
一、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
本文出自 “Arvin Lau” 博客,请务必保留此出处http://64314491.blog.51cto.com/2784219/1636240
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。