第二十章、shell编程之循环语句与函数

第二十章、shell编程之循环语句与函数

1、循环

循环(Loop)和遍历(Traversal)是两个在计算机编程中经常使用的概念
循环是一种重复执行一段代码的结构。通过循环,可以在满足一定条件的情况下,多次执行相同的代码。循环语句通常包括一个循环体(Loop Body)和一个循环条件(Loop Condition),当循环条件满足时,循环体会被执行,否则循环结束。

2、遍历

遍历是指对一组数据结构中的每个元素进行一次访问的过程。在计算机编程中,常常需要对数组、列表、树等数据结构中的每个元素进行遍历以便对它们进行操作或者输出。

循环是一种控制流程的结构,用于重复执行一段代码,而遍历是一种数据操作的过程,用于访问并处理数据结构中的每个元素在某些情况下,循环和遍历可以结合使用,以便在循环中遍历数据结构并对其进行操作。

3、for循环语句

读取不同的变量值,用来逐个执行同一组命令,用于已知循环次数的场景

3.1 基本格式一

#!/bin/bash
for +变量名称 +in {变量范围}
do——执行内容,若满足循环则做什么动作
echo “$变量”
done——for循环结束标志

示例

[root@xiaowang ~]# chmod +x 1.sh
[root@xiaowang ~]# cat 1.sh
#!/bin/bash
for i in {1..5}
do
echo "$i"
done
[root@xiaowang ~]# ./1.sh
1
2
3
4
5

3.2 类C语言格式二

#!/bin/bash
for((表达式1;表达式2;表达式3))
do——执行内容,若满足循环则做什么动作
done——for循环结束标志

表达式1:定义变量并赋值
表达式2:决定是否循环(定义循环退出的条件)
表达式3:决定循环变量如何改变,决定循环什么时候结束

示例:

[root@xiaowang ~]# cat for_num.sh
#!/bin/bash
for ((i=0;i<=5;i++))
do
echo $i
done
[root@xiaowang ~]# bash for_num.sh
0
1
2
3
4
5
[root@xiaowang ~]# cat for_num.sh
#!/bin/bash
for ((i=0;i<=7;i+=2))
do
echo $i
done
[root@xiaowang ~]# bash for_num.sh
0
2
4
6

3.3 数字累加脚本

思路
①累加需要用到循环,已知循环次数时使用for循环
②也可以使用while循环达到累加条件时结束循环
方法一:

[root@xiaowang ~]# cat for_sum.sh
#!/bin/bash
sum=0                        ###定义变量初始值为0
for i in {1..100}            ###for循环,i取值从1到100
do
sum=$(($i + $sum))
done
echo "$sum"
[root@xiaowang ~]# bash for_sum.sh
5050

方法二:

[root@xiaowang ~]# cat sum.sh
#!/bin/bash
sum=0
for ((i=0;i<=100;i++))
do
sum=$(($i + $sum))
done
echo "1~100累加值为:$sum"
[root@xiaowang ~]# bash sum.sh
1~100累加值为:5050

方法三

[root@xiaowang ~]# cat 5.sh
#!/bin/bash
sum=0
for i in $(seq 0 100)
do
sum=$(($sum + $i))
done
echo "$sum"
[root@xiaowang ~]# sh 5.sh
5050

3.4 seq命令

seq 是一个 Linux/Unix 命令,用于生成一个序列(sequence)并打印出来,默认从1开始
示例

[root@xiaowang ~]# seq 10                ###表示默认从1开始打印到10结束
1
2
3
4
5
6
7
8
9
10

[root@xiaowang ~]# seq 10 -2 0          ###表示从10开始递减2到0,并打印出来
10
8
6
4
2
0

[root@xiaowang ~]# seq 10 2 20          ###表示从10开始递增2到20,并打印出来
10
12
14
16
18
20

[root@xiaowang ~]# a=$(seq 1 10)
[root@xiaowang ~]# echo $a
1 2 3 4 5 6 7 8 9 10
[root@xiaowang ~]# echo -n $a          ###echo -n 不换行输出
1 2 3 4 5 6 7 8 9 10[root@xiaowang ~]#

[root@xiaowang ~]# a=$(seq 10 -2 0)    ###反向生成
[root@xiaowang ~]# echo $a
10 8 6 4 2 0
[root@xiaowang ~]# echo -n $a
10 8 6 4 2 0[root@xiaowang ~]#

3.5 分别求从1到100所有整数的偶数和、奇数和

[root@xiaowang ~]# cat sum.sh
#!/bin/bash
#偶数和的初始值
num1=0
#奇数和的初始值
num2=0
for i in {1..100}
do
  if ((i % 2 == 0));then
  num1=$(($num1 + i))
  else
  num2=$(($num2 + i))
  fi
done
echo "1~100中所有偶数和为:$num1"
echo "1~100中所有奇数和为:$num2"
[root@xiaowang ~]# bash sum.sh
1~100中所有偶数和为:2550
1~100中所有奇数和为:2500

3.6 常用转义字符

3.6.1 echo -n ——表示不换行输出
3.6.2 echo -e ——输出转义字符,将转义后的内容输出到屏幕上
[root@client ~]# echo -n "abc"
abc[root@client ~]#
[root@client ~]# echo -e "abc"
abc
3.6.3 echo -ne只有加了-e才能执行下面的转义符
3.6.4 常用的转义字符如下

① \b——转义后相当于按退格键(backspace),但前提是"\b"后面存在字符;“\b"表示删除前一个字符,”\b\b"表示删除前两个字符。
示例

[root@client ~]# echo -e "abc\b123"
ab123
[root@client ~]# echo -e "abc\b\b123"
a123

② \c——不换行输出,在"\c"后面不存在字符的情况下,作用相当于 echo -n; 但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。
示例

[root@client ~]# echo -e "abc\c"
abc[root@client ~]# 
[root@client ~]# echo -e "abc\c123"
abc[root@client ~]#

③ \n——换行,被输出的字符从"\n"处开始另起一行。
示例

[root@client ~]# echo -e "abc\n123"
abc
123

④ \f——换行,但是换行后的新行的开头位置连接着上一行的行尾;
⑤ \v 与\f相同;
示例

[root@client ~]# echo -e "abc\f123"
abc
123
[root@client ~]# echo -e "abc\v123"
abc
   123

⑥ \t——转义后表示插入tab,即横向制表符(tab);
示例

[root@client ~]# echo -e "abc\t123"
abc     123

⑦ \r——光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖
示例

[root@client ~]# echo -e "abc\r123"
123
[root@client ~]# echo -e "abc\r"
abc
[root@client ~]# echo -e "abc\r123456"
123456

⑧ \——表示插入""本身;
示例

[root@client ~]# echo -e "abc\123"
abc\123

3.7 continue跳出循环

表示满足continue条件时跳出循环,但是不影响后续循环执行,它的作用是在循环内部跳过本次循环并继续下一次循环

示例

[root@client ~]# cat 1.sh
#!/bin/bash
for i in {1..5}
do
   if [ $i -eq 3 ];then
   continue
   fi
   echo "$i"
done
[root@client ~]# bash 1.sh
1
2
4
5
[root@client ~]# cat 1.sh
#!/bin/bash
for h in {1..3}
do
 for i in {1..5}
 do
   if [ $i -eq 3 ];then
   continue 2
   fi
   echo -e "$i"
 done
done
[root@client ~]# bash 1.sh
1
2
1
2
1
2

continue 2 是一个 Shell 中的控制结构,它的作用是在循环内部跳过本次循环并继续下一次循环,
而且会跳过两层循环,即在两层循环内部执行。

在嵌套循环中,如果我们使用 continue 2 命令,
它将跳过包含它的内层循环和外层循环的迭代,并继续执行下一次外层循环的迭代
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

[root@client ~]# cat 1.sh
#!/bin/bash
for h in {1..3}
do
 for i in {1..5}
 do
   if [ $i -eq 3 ];then
   continue
   fi
   echo "$i"
 done
done
[root@client ~]# bash 1.sh
1
2
4
5
1
2
4
5
1
2
4
5

3.8 break跳出循环

在某个循环中遇到break直接结束此次循环,但是不影响外边嵌套的循环。

break [数字] 结束数字中的几次循环,若为2则结束自己所在循环和外边嵌套的一层循环,
若为3则结束自己所在循环和外边嵌套的2层循环

break 命令并不控制循环次数,它是用于控制循环流程的。
当 break 命令执行时,它会立即跳出当前的循环并继续执行循环后面的代码。
示例

[root@client ~]# cat 2.sh
#!/bin/bash
for j in {1..3}
do
  for i in {1..5}
  do
  if [ $i -eq 3 ];then
  break 2
  fi
  echo "$i"
  done
done
[root@client ~]# bash 2.sh
1
2

3.9 在循环中使用 break 和 continue 命令时,它们分别有以下作用:

break:在循环内部,当执行到 break 命令时,会立即跳出当前的循环,停止循环执行,然后继续执行下一条指令。
可以使用 break 命令来提前终止循环,例如当达到特定条件时或者已经执行了足够的次数。

continue:在循环内部,当执行到 continue 命令时,会跳过本次循环剩余的代码,并继续下一次循环。
可以使用 continue 命令来跳过循环中的某些操作,例如在特定条件下跳过一次循环,或者只执行符合条件的循环。

在嵌套循环中,可以在 break 和 continue 命令后面指定数字参数,来指定跳出或跳过多层循环。
例如,break 2 会跳出当前循环和外层循环的迭代,而continue 2会跳过当前循环和两层外层循环的迭代。

break和continue命令是控制循环流程重要命令。

3.10 常用循环脚本实例

99乘法表

[root@xiaowang ~]# cat 99.sh
#!/bin/bash
#外循环控制行数
for i in $(seq 1 9)
do
#内循环控制列数,列数等于行数
  for j in $(seq 1 $i)
  do
  echo -ne "$j*$i=$(($j*$i))\t"
  done
#换行  
echo
done
[root@xiaowang ~]# bash 99.sh
1*1=1
1*2=2   2*2=4
1*3=3   2*3=6   3*3=9
1*4=4   2*4=8   3*4=12  4*4=16
1*5=5   2*5=10  3*5=15  4*5=20  5*5=25
1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

4、while循环语句

while循环满足条件执行,不满足不执行,用于不知道循环次数,需要主动结束循环或达到条件结束循环。

4.1 基本格式

while [ 判断条件]
do
执行动作 ### while循环执行动作
done ###while循环结束标志 while true

4.2 示例

[root@xiaowang demo]# cat A.sh
#!/bin/bash
i=0
while [ $i -le 5 ]             ###变量i小于等于5时执行while循环
do
echo "$i"                      ###环执行内容,每循环一次打印$i
let i++
done
[root@xiaowang demo]# sh A.sh
0
1
2
3
4
5

4.3 死循环语句

4.3.1 格式一

while [1 -eq 1] ###判断条件写一个永久为真的条件
do ### 一直执行do内的命令
done

4.3.2 格式二

while true ###直接写判断条件为真
do ###一直执行do内的命令
done

4.3.3 格式三

while : ###判断条件为冒号也表示死循环
do ###一直执行do内的命令
done

5、until循环语句

5.1 基本格式

until循环通常用于当判断条件不成立时才进行循环,一旦判断条件成立,就终止循环,
比如等待某个进程退出、等待某个文件被创建等等
until [ 条件测试操作 ]
do
判断式/命令序列
done

5.2 示例

[root@xiaowang demo]# cat A.sh
#!/bin/bash
i=0
sum=0
until [ $i -gt 5 ]
do
echo "$i"
let i++
sum=$(($sum+$i))
done
echo "和为:$sum"
[root@xiaowang demo]# sh A.sh
0
1
2
3
4
5
和为:21


do ###一直执行do内的命令
done

4.3.3 格式三

while : ###判断条件为冒号也表示死循环
do ###一直执行do内的命令
done

5、until循环语句

5.1 基本格式

until循环通常用于当判断条件不成立时才进行循环,一旦判断条件成立,就终止循环,
比如等待某个进程退出、等待某个文件被创建等等
until [ 条件测试操作 ]
do
判断式/命令序列
done

5.2 示例

[root@xiaowang demo]# cat A.sh
#!/bin/bash
i=0
sum=0
until [ $i -gt 5 ]
do
echo "$i"
let i++
sum=$(($sum+$i))
done
echo "和为:$sum"
[root@xiaowang demo]# sh A.sh
0
1
2
3
4
5
和为:21
  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值