文章目录
前言
循环(Loop)是计算机编程中非常重要的一种结构,其主要目的是为了简化代码编写,提高代码的重复利用率,以及提高程序的效率。
一、循环
1.循环的作用
-
重复执行代码:通过使用循环,可以在程序中重复执行一段代码,从而避免代码的重复编写,
减少程序代码量,提高程序的可读性和可维护性。 -
简化程序逻辑:使用循环可以使程序逻辑更加简洁明了,提高程序的可读性和可理解性,降低代码出错的可能性。
-
提高代码的重复利用率:通过将重复的代码封装在循环结构中,可以提高代码的重复利用率,减少代码冗余。
-
提高程序的效率:循环可以让程序自动化地执行重复任务,从而减少人工干预的次数,提高程序的效率和性能。
2.循环和遍历
循环(Loop)和遍历(Traversal)是两个在计算机编程中经常使用的概念。
循环是一种重复执行一段代码的结构。通过循环,可以在满足一定条件的情况下,多次执行相同的代码。循环语句通常包括一个循环体(Loop Body)和一个循环条件(Loop Condition),当循环条件满足时,循环体会被执行,否则循环结束。
而遍历是指对一组数据结构中的每个元素进行一次访问的过程。在计算机编程中,常常需要对数组、列表、树等数据结构中的每个元素进行遍历,以便对它们进行操作或者输出。
循环是一种控制流程的结构,用于重复执行一段代码,而遍历是一种数据操作的过程,用于访问并处理数据结构中的每个元素。在某些情况下,循环和遍历可以结合使用,以便在循环中遍历数据结构并对其进行操作。
二、for循环语句
1.for语句的用法
- 读取不同的变量值,用来逐个执行同一组命令。
- for循环经常使用在已经知道要进行多少次循环的场景。
- 使用for循环语句时,需要指定一个变量及可能的取值列表,针对每一个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。在这里,“取值列表”称为for语句的执行条件,其中包括多个属性相同的对象,需要预定指定。
2.for逻辑结构
for语句的执行流程:首先将循环列表中的元素赋值给变量,每次赋值便执行一次循环,done就标志着一个循环的结束。直到列表中的元素消耗殆尽,结束整个循环。
3.for语句的格式
一般格式
for 变量 in 取值列表
do
命令序列
done
注:变量可以不加$
,in 取值列表
可以不写。
类C语言格式
for ((expr1;expr2;expr3))
do
命令序列
done
expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出
死循环
for ((;;))
do
命令序列
done
4.echo的用法
echo -n 表示不换行输出。
echo -e 输出转义字符,将转义后的内容输出到屏幕上
只有加了-e
才能执行下面的转义符:
常用的转义字符如下:
转义符 | 含义 |
---|---|
\b | 转义后相当于按退格键(backspace),但前提是"\b"后面存在字符;“\b"表示删除前一个字符,”\blb"表示删除前两个字符 |
\c | 不换行输出,在"\c"后面不存在字符的情况下,作用相当于echo -n;但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出 |
\n | 换行,被输出的字符从"\n"处开始另起一行。 |
\f | 换行,但是换行后的新行的开头位置连接着上一行的行尾;\v 与\f相同 |
\t | 转以后表示插入tab,即横向制表符 |
\r | 光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖 |
\\ | 表示插入"\"本身 |
5.for语句的典型案列
为用户批量添加密码,用户信息保存在opt/目录下。
[root@localhost ~]# vim user.sh
#!/bin/bash
for i in $(cat /opt/user.txt )
do
useradd $i
echo 123456 | passwd --stdin $i
done
[root@localhost ~]# bash user.sh
更改用户zhangsan的密码。
passwd:所有的身份验证令牌己经成功更新。
更改用户lisi的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户wangwu的密码。
passwd:所有的身份验证令牌已经成功更新。
更改用户zhaoliu的密码。
passwd:所有的身份验证令牌己经成功更新。
画一条直线
[root@localhost ~]# vim abc.sh
for ((i=1;i<=9;i++))
do
echo "*"
done
~
[root@localhost ~]# bash abc.sh
*
*
*
*
*
*
*
*
*
九九乘法表
[root@localhost ~]# vim sum.sh
for ((i=1;i<=9;i++))
do
for ((j=1;j<=i;j++))
do
echo -ne "$i*$j=$(($i*$j))\t"
done
echo
done
[root@localhost ~]# bash sum.sh
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
三、while循环语句
1.while语句的用法
for循环语句非常适用于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用另一种循环——while语句。
while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环
2.while逻辑结构
while语句的执行流程:先对定义的条件进行判断,如果该条件成立,就进入循环,执行 while 循环体中的语句,也就是 do 和 done 之间的语句。这样就完成了一次循环。每一次执行到 done 的时候都会重新判断条件是否成立,如果成立,就进入下一次循环,继续执行 do 和 done 之间的语句,如果不成立,就结束整个 while 循环,执行 done 后面的其它 Shell 代码。如果一开始条件就不成立,那么程序就不会进入循环体,do 和 done 之间的语句就没有执行的机会。
注意,在 while 循环体中必须有相应的语句使得条件越来越趋近于“不成立”,只有这样才能最终退出循环,否则 while 就成了死循环,会一直执行下去,永无休止。
3.while语句的格式
一般格式
定义变量
while 表达式(条件)
do
循环语句命令
done
死循环
while [1 -eq 1] #判断条件写一个永久为真的条件
do #一直执行do内的命令
done
while true #直接写判断条件为真
do #一直执行do内的命令
done
while : #判断条件为冒号也表示死循环
do #一直执行do内的命令
done
4.while语句的典型案例
批量建立用户
#!/bin/bash
i=0
while [ "${i}" -le 20 ]
do
useradd stu${i}
echo "123456" |passwd --stdin stu${i} &>/dev/null
if [ $? -eq 0 ]
then
echo "用户 stu${i} 被建立"
else
echo "用户 stu${i} 建立失败"
fi
let i++
done
批量删除用户
#!/bin/bash
i=0
while [ "${i}" -le 20 ]
do
userdel -r stu${i}
let i++
done
猜价格游戏
#!/bin/bash
p=`echo $[RANDOM%1000+1]`
t=0
while true
do
read -p "请输入商品的价格1-1000:" num
let t++
if [ $num -eq $p ]
then
echo "恭喜你猜中了,实际价格是$p"
echo "一共猜了${t}次"
exit 0
elif [ $num -gt $p ]
then
echo "猜的价格高了"
else
echo "猜的价格低了"
fi
done
四、until命令
1.until语句的用法
until循环执行一系列命令直至条件为真时停止。until循环与while循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用。
2.until逻辑结构
until语句的执行流程:先对定义的条件进行判断,如果该条件不成立,就进入循环,执行 until 循环体中的语句,也就是 do 和 done 之间的语句。这样就完成了一次循环。每一次执行到 done 的时候都会重新判断条件是否成立,如果还是不成立,就进入下一次循环,继续执行 do 和 done 之间的语句,如果成立了,就结束整个 until 循环,执行 done 后面的其它 Shell 代码。如果一开始条件就成立,那么程序就不会进入循环体,do 和 done 之间的语句就没有执行的机会。
3.until语句的格式
until [ 条件测试操作 ]
do
判断式/命令序列
done
4.until语句的典型案例
[root@localhost opt]# vim until.sh
i=0
sum=0
until [ $i -gt 10 ]
do
echo $i
let i++
sum=$(($sum+$i))
done
五、控制循环流程命令
1.break
在循环内部,当执行到 break 命令时,会立即跳出当前的循环,停止循环执行,然后继续执行下一条指令。可以使用 break 命令来提前终止循环,例如当达到特定条件时或者已经执行了足够的次数。
[root@localhost opt]# vim break.sh
#!/bin/bash
for j in {1..3} ##第一层for循环,j=1,2,3各执行一次do的内容
do ##第一层for循环的执行内容
for i in {1..5} ##第二层for循环,i=1,2,3,4,5各执行一次do的内容
do ##第二层for循环的执行内容
if [ $i -eq 3 ] ##第二层for循环中添加的if判断语句,当$i=3是执行then内容
then ##第二层for循环判断语句执行命令,break控制循环的流程
break 2
fi ##if语句结束
echo "$i" ##第二层for循环语句执行每循环一次输出$i
done ##第二层for循环语句结束标志
done ##第一层for循环语句结束标志
2.continue
在循环内部,当执行到 continue 命令时,会跳过本次循环剩余的代码,并继续下一次循环。可以使用 continue 命令来跳过循环中的某些操作,例如在特定条件下跳过一次循环,或者只执行符合条件的循环。
[root@localhost opt]# vim continue.sh
#!/bin/bash
for i in [1..5]
do
if [ $i -eq 2 ]
then
continue
fi
echo "$i"
done
[root@localhost opt]# vim continue.sh
1
3
4
5