【转】shell之for、while、until循环
一、简介
Shell编程中循环命令用于特定条件下决定某些语句重复执行的控制方式,有三种常用的循环语句:for、while和until。while循环和for循环属于“当型循环”,而until属于“直到型循环”。循环控制符:break和continue控制流程转向。
二、详解
1、for循环
(1)for循环有三种结构:一种是列表for循环,第二种是不带列表for循环。第三种是类C风格的for循环。
(2)列表for循环
#!/bin/bash
for varible1 in {..}
#for varible1 in
do
echo "Hello, Welcome $varible1 times "
done
- do和done之间的命令称为循环体,执行次数和list列表中常数或字符串的个数相同。for循环,首先将in后list列表的第一个常数或字符串赋值给循环变量,然后执行循环体,以此执行list,最后执行done命令后的命令序列。
- Sheel支持列表for循环使用略写的计数方式,1~5的范围用{1..5}表示(大括号不能去掉,否则会当作一个字符串处理)。
- Sheel中还支持按规定的步数进行跳跃的方式实现列表for循环,例如计算1~100内所有的奇数之和。
#!/bin/bash
sum= for i in {....}
do
let "sum+=i"
done echo "sum=$sum"
通过i的按步数2不断递增,计算sum值为2500。同样可以使用seq命令实现按2递增来计算1~100内的所有奇数之和,for i in $(seq 1 2 100),seq表示起始数为1,跳跃的步数为2,结束条件值为100。
- for循环对字符串进行操作,例如通过for循环显示当前目录下所有的文件。
#!/bin/bash for file in $( ls )
#for file in *
do
echo "file: $file"
done

也可一使用for file in *,通配符*产生文件名扩展,匹配当前目录下的所有文件。
- for通过命令行来传递脚本中for循环列表参数
#!/bin/bash echo "number of arguments is $#" echo "What you input is: " for argument in "$@"
do
echo "$argument"
done

$#表示参数的个数,$@表示参数列表而$*则把所有的参数当作一个字符串显示。
(3)不带列表for循环
由用户制定参数和参数的个数,与上述的for循环列表参数功能相同。
#!/bin/bash echo "number of arguments is $#" echo "What you input is: " for argument
do
echo "$argument"
done
比上述代码少了$@参数列表,$*参数字符串。
(4)类C风格的for循环
也被称为计次循环
#!/bin/bash
for((integer = ; integer <= ; integer++))
do
echo "$integer"
done

for中第一个表达式(integer = 1)是循环变量赋初值的语句,第二个表达式(integer <= 5)决定是否进行循环的表达式,退出状态为非0时将退出for循环执行done后的命令(与C中的for循环条件是刚好相反的)。第三个表达式(integer++)用于改变循环变量的语句。
Sheel中不运行使用非整数类型的数作为循环变量,循环条件被忽略则默认的退出状态是0,for((;;))为死循环。
类C的for循环计算1~100内所有的奇数之和。
#!/bin/bash sum= for(( i = ; i <= ; i = i + ))
do
let "sum += i"
done echo "sum=$sum"
2、while循环
也称为前测试循环语句,重复次数是利用一个条件来控制是否继续重复执行这个语句。为了避免死循环,必须保证循环体中包含循环出口条件即表达式存在退出状态为非0的情况。
(1)计数器控制的while循环 使用(())标识符 ,注意while与括号,括号与内容之间都有空格
#!/bin/bash sum= i= while(( i <= ))
do
let "sum+=i"
let "i += 2"
done echo "sum=$sum"
指定了循环的次数500,初始化计数器值为1,不断测试循环条件i是否小于等于100。在循环条件中设置了计数器加2来计算1~100内所有的奇数之和。
(2)结束标记控制的while循环
设置一个特殊的数据值(结束标记)来结束while循环。
#!/bin/bash echo "Please input the num(1-10) "
read num while [[ "$num" != ]]
do
if [ "$num" -lt ]
then
echo "Too small. Try again!"
read num
elif [ "$num" -gt ]
then
echo "To high. Try again"
read num
else
exit
fi
done echo "Congratulation, you are right! "

#!/bin/bash echo "Please input the num "
read num factorial= while [ "$num" -gt ]
do
let "factorial= factorial*num"
let "num--"
done echo "The factorial is $factorial"

(3)标志控制的while循环,注意while与括号,括号与内容之间都有空格
使用用户输入的标志值来控制循环的结束(避免不知道循环结束标志的条件)。
#!/bin/bash echo "Please input the num "
read num sum=
i= signal= while [[ "$signal" -ne ]]
do
if [ "$i" -eq "$num" ]
then
let "signal=1"
let "sum+=i"
echo "1+2+...+$num=$sum"
else
let "sum=sum+i"
let "i++"
fi
done
标志控制的while循环求1~n的累加和,循环变量值小于100执行else累加同时循环变量加1,直到循环变量值等于100将标志值设置为1,并输出。
标志控制的while循环与结束标记控制的while循环的区别是用户无法确定无法确定结束标志,只能程序运行后确定结束标志。两者也可以相互转化。
(4)命令行控制的while循环
使用命令行来指定输出参数和参数个数,通常与shift结合使用,shift命令使位置变量下移一位($2代替$1、$3代替$2,并使$#变量递减),当最后一个参数显示给用户,$#会等于0,$*也等于空。
#!/bin/bash echo "number of arguments is $#" echo "What you input is: " while [[ "$*" != "" ]]
do
echo "$1"
shift
done

循环条件可以改写为while[[ "$#" -ne 0 ]],等于0时退出while循环
3、until循环
until命令和while命令类似,while能实现的脚本until同样也可以实现,但区别是until循环的退出状态是不为0,退出状态是为0(与while刚好相反),即whie循环在条件为真时继续执行循环而until则在条件为假时执行循环。
#!/bin/bash i= until [[ "$i" -gt ]] #大于5
do
let "square=i*i"
echo "$i * $i = $square"
let "i++"
done

4、循环嵌套
一个循环体内又包含另一个完整的循环结构,在外部循环的每次执行过程中都会触发内部循环,for、while、until可以相互嵌套。
(1)嵌套循环实现九九乘法表
#!/bin/bash for (( i = ; i <=; i++ ))
do for (( j=; j <= i; j++ ))
do
let "temp = i * j"
echo -n "$i*$j=$temp "
done echo "" #output newline
done

(2)for循环嵌套实现*图案排列
#!/bin/bash for ((i=; i <= ; i++))
do
j=;
while ((j > i))
do
echo -n " "
let "j--"
done
k=
while ((k <= i))
do
echo -n "*"
let "k++"
done
echo ""
done

外层for循环嵌套了两个内层while循环,先打印空格在打印*号形成图案。
5、循环控制符break和continue
若须退出循环可使用break循环控制符,若退出本次循环执行后继续循环可使用continue循环控制符。
(1)break
在for、while和until循环中break可强行退出循环,break语句仅能退出当前的循环,如果是两层循环嵌套,则需要在外层循环中使用break。
#!/bin/bash sum=
for (( i=; i <= ; i++))
do
let "sum+=i" if [ "$sum" -gt ]
then
echo "1+2+...+$i=$sum"
break
fi
done
(2)continue
在for、while和until中用于让脚本跳过其后面的语句,执行下一次循环。continue用于显示100内能被7整除的数。
#!/bin/bash m=
for (( i=; i < ; i++ ))
do
let "temp1=i%7" #被7整除 if [ "$temp1" -ne ]
then
continue
fi echo -n "$i " let "temp2=m%7" #7个数字换一行 if [ "$temp2" -eq ]
then
echo ""
fi let "m++"
done

6、select结构
select结构从技术角度看不能算是循环结构,只是相似而已,它是bash的扩展结构用于交互式菜单显示,功能类似于case结构比case的交互性要好。
(1)select带参数列表
#!/bin/bash echo "What is your favourite color? " select color in "red" "blue" "green" "white" "black"
do
break
done echo "You have selected $color"

(2)select不带参数列表
该结构通过命令行来传递参数列表,由用户自己设定参数列表。
#!/bin/bash echo "What is your favourite color? " select color
do
break
done echo "You have selected $color"

三、总结
(1)循环结构中相互嵌套组成更复杂的流程,并结合break和continue可以实现很多复杂的运算。
(2)可以结合其他语言的语法有助于更好的理解循环结构。
(3)熟练应用还需要大量的重复练习,重写优秀的shell代码也是一种很好的方式。
(以上转自https://blog.csdn.net/taiyang1987912/article/details/38929069)
【转】shell之for、while、until循环的更多相关文章
- linux下的Shell编程(5)循环
Shell Script中的循环有下面几种格式: while [ cond1 ] && { || } [ cond2 ] -; do - done for var in -; do - ...
- linux shell中 if else for循环以及大于、小于、等于逻辑表达式的历程
作者:邓聪聪 比如比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示条件测试. 注意:这里的空格很重要.要确保方括号的空格.笔者就曾因为空格缺少或位置不对,而浪费好多宝 ...
- shell编程学习笔记(十一):Shell中的while/until循环
shell中也可以实现类似java的while循环 while循环是指满足条件时,进行循环 示例: #! /bin/sh index=10 while [ $index -gt 0 ] do inde ...
- Shell编程-08-Shell中的循环语句
目录 while语句 until语句 for语句 select语句 循环中断控制 循环语句总结 循环语句常用于重复执行一条命令或一组命令等,直到达到结束条件后,则终止执行.在Shell中常见的 ...
- shell脚本判断语句和循环语句
if判断语句 exit跳出判读语句 不加exit的结果 read -n(不换行) 判断是否输入的是数字 read age[[ $age =~ ^[0-9]+$ ]]if [ $? -ne 0 ]; t ...
- shell基础(八)-循环语句
国庆过后:感觉有点慵懒些了:接着上篇:我们继续来学习循环语句. 一. for循环 与其他编程语言类似,Shell支持for循环. for循环一般格式为: for 变量 in 列表 do command ...
- Shell脚本之:退出循环
Shell也使用 break 和 continue 来跳出循环. break命令 下面的例子中,脚本进入死循环直至用户输入数字大于5,使用break跳出这个循环. #!/bin/bash while ...
- 【shell】shell编程(四)-循环语句
上篇我们学习了shell中条件选择语句的用法.接下来本篇就来学习循环语句.在shell中,循环是通过for, while, until命令来实现的.下面就分别来看看吧. for for循环有两种形式: ...
- Shell脚本之七 选择、循环结构
一.if else if 语法格式 if condition then command1 command2 ... commandN fi 写成一行(适用于终端命令提示符): if [ $(ps -e ...
- shell 学习笔记9-while/until循环语句
一.while循环语句 1.循环语句 循环愈久就是重复执行一条指令或一组执行,知道条件不在满足时停止,shell循环语句包括,while.until.for.select语句 2.while循环 主要 ...
随机推荐
- java求解第N个素数(质数)
面试中,遇到一个题目:求解第N个素数. import java.util.Scanner; public class GetPrimeNumber { public static int NthPri ...
- linux ubuntu 关于vim得一些基本命令
1.vim显示行号 :set number 2. 快捷键 J 向下 K 往上 H 向左 L 向右 ctrl+shift+T 打开新窗口 ctrl+Page Down 所有vim窗口向下切换 ctrl+ ...
- 数据结构【查找】—平衡二叉树AVL
/*自己看了半天也没看懂代码,下次再补充说明*/ 解释: 平衡二叉树(Self-Balancing Binary Search Tree 或Height-Balanced Binary Search ...
- Go学习笔记05-指针
目录 参数传递 var a int = 2 var pa *int = &a *pa = 3 fmt.Println(a) Go语言中 指针不能运算 参数传递 不像C++.Java.Pytho ...
- ORM版学员管理系统2
学生信息管理 展示学生信息 URL部分 url(r'^student_list/', app01_views.student_list, name="student_list"), ...
- 【BZOJ2117】 [2010国家集训队]Crash的旅游计划
[BZOJ2117] [2010国家集训队]Crash的旅游计划 Description 眼看着假期就要到了,Crash由于长期切题而感到无聊了,因此他决定利用这个假期和好友陶陶一起出去旅游. Cra ...
- Linux 系统故障排查和修复技巧
Linux 系统故障排查和修复技巧 我发现Linux系统在启动过程中会出现一些故障,导致系统无法正常启动,我在这里写了几个应用单用户模式.GRUB命令操作.Linux救援模式的故障修复案例帮助大家了解 ...
- 5.01-requests_auth
import requests # 发送post请求 data = { } response = requests.post(url, data=data) # 内网 需要 认证 auth = (us ...
- VMware15安装MAC(MAC OS 10.13)(OS X 10.14)原版可升级最新可解锁macOS Unlocker3.0(OS X 10.13)
目录树 1.1.2安装环境: 1.1.3所需资源: 1.1.4 Unlocker 3.0解锁 1.1.5 配置环境 1.1.6开始安装 1.1.7开启虚拟机进入MAC安装界面 1.1.8 macO ...
- Keepalive工作原理
Keepalive工作原理 1.1软件介绍 Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能.因此 ...