Linux之Shell编程之循环语句与函数

Shell编程之循环语句与函数

本章结构

循环语句

  • for循环语句
  • while循环语句
  • untli循环语句

Shell函数

Shell数组

循环

循环概念

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

遍历概念

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

循环和遍历的对比

循环是一种控制流程的结构,用于重复执行一段代码,而遍历是一种数据操作的过程,用于访问并处理数据结构中的每个元素。在某些情况下,循环和遍历可以结合使用,以便在循环中遍历数据结构并对其进行操作。循环(Loop)是计算机编程中非常重要的一种结构,其主要目的是为了简化代码编写。

for语句的结构

读取不同的变量值,用来逐个执行同一组命令

在这里插入图片描述

基本格式

for   ------变量名称(注意是名称不是变量$等)    [  in   名称范围  ] (可以不写)

do     --------执行内容    若满足循环则做什么动作

done    ------for循环结束标志

举例
vim  a.sh               #创建脚本a.sh
脚本内容:
#!/bin/bash
for  i   in  {1..5}    #for循环5次,第一次i=1,第二次i=2以此类推直到i=5
do
echo "$i"               #循环动作,每次输出$i 
done                    #for语句结束标志

bash  a.sh              #调用shell执行脚本a.sh
执行结果:
1
2
3
4
5
数字累加脚本(1-100)
需求:编写脚本实现计算从1加到100的值
思路:
  1. 累加需要用到循环,已知循环次数时使用for循环
  2. 也可以使用while循环达到累加条件时结束循环
vim sum.sh    #创建sum.sh脚本
脚本内容:
sum=0         #定义变量sum初始值为0
for i in {1..100} #for循环 i取值从1到100
do
sum=$(($i+$sum))     1+0  2+1  3+3 
#let sum=$i+$sum    #每次循环内容计算变量i+sum的值赋值给sum,二选一
done              #for语句结束标志
echo "1-100累加值为:$sum"  #循环结束后输出内容
sh sum.sh                #调用shell执行脚本

执行结果:
"1-100累加值为:5050"
1+0=1
2+0=2
3+0=3
4+0=4

第二种方式:
#!/bin/bash
sum=0
for ((i=0;i<=100;i++))
do
sum=$[i+sum]
done
echo $sum
seq命令
seq 是一个 Linux/Unix 命令,用于生成一个序列(sequence)并打印出来。
[root@localhost opt]# seq 10 #表示到10结束
1
2
3
4
5
6
7
8
9
10

[root@localhost opt]# seq 10 -2 1 #10表示从10开始
10
8
6
4
2

[root@localhost opt]# seq 2 2 10
2
4
6
8
10



[root@localhost opt]# a=$(seq 1 10)
[root@localhost opt]# echo -n $a
1 2 3 4 5 6 7 8 9 10

[root@localhost ~]# a=$(seq 20 -1 1) #反向生成
[root@localhost ~]# echo $a
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

[root@localhost ~]# a=$(seq 20 -2 1)
[root@localhost ~]# echo $a
20 18 16 14 12 10 8 6 4 
求从1到100所有整数的偶数和、奇数和
#!/bin/bash

num1=0                                   #偶数和的初始值
num2=0                                   #奇数和的初始值
(嵌套if)
for i in {1..100}
do
  if (( i % 2 == 0 )); then              #判断i是否是偶数
    num1=$(($num1+i))                    #如果是偶数,则加到偶数和中
  else
    num2=$(($num2+i))                    #如果是奇数,则加到奇数和中
  fi
done

echo "1 到 100 中所有偶数的和为:$num1"
echo "1 到 100 中所有奇数的和为:$num2"

常用转义字符

  • echo -n 表示不换行输出
  • echo -e 输出转义字符,将转义后的内容输出到屏幕上 echo -ne
  • 只有加了-e才能执行下面的转义符:

常用的转义字符如下:

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

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

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

  • \f 换行,但是换行后的新行的开头位置连接着上一行的行尾;

  • \v 与\f相同;

  • \t 转以后表示插入tab,即横向制表符(tab);

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

  • \ 表示插入""本身;

跳出循环

1.continue跳出循环

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

举例:

举例:
vim a.sh         #创建脚本a.sh
脚本内容:
#!/bin/bash
for i in {1..5}  #for循环5次从i=1开始到i=5    
do
if [ $i -eq 3 ]  #if判断语句,若$1等于3则执行then的内容
then 
continue         #当$i=3时跳出循环但不影响后面循环  
fi               #结束if语句
echo "$i"        #没执行一次for循环输出一次$i
done             #for循环结束语句
sh a.sh        #调用shell执行脚本
输出结果
1
2
4
5


#可以实现吗?
#!/bin/bash
for i in {1..10}
do
if [ $i -eq 5 ]
then continue 2
fi
echo i=$i
done

再来看一个例子:
for j in {1..3}
do
    for i in {1..5}
    do
        if [ $i -eq 2 ]
        then
        continue 
        fi
    echo "$i"          
    done
done

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

在嵌套循环中,如果我们使用 continue 2 命令,
它将跳过包含它的内层循环和外层循环的迭代,并继续执行下一次外层循环的迭代

2.break跳出循环

  • 在某个循环中遇到break直接结束此次循环,但是不影响外边嵌套的循环。
  • break [数字] 结束数字中的几次循环,若为2则结束自己所在循环和外边嵌套的一层循环,若为3则结束自己所在循环和外边嵌套的2层循环
  • break 命令并不控制循环次数,它是用于控制循环流程的。当 break 命令执行时,它会立即跳出当前的循环并继续执行循环后面的代码。
举例:
vim   a.sh     #创建a.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                
        break 2          #第二层for循环判断语句执行命令,break控制循环的流程
        fi               #if语句结束
    echo "$i"            #第二层for循环语句执行每循环一次输出$i
    done                 #第二层for循环语句结束标志                
done                     #第一层for循环语句结束标志
sh a.sh                #调用bash执行a.sh脚本

具体来说,这段脚本的执行过程如下:
外部循环 for j in {1..3} 循环执行三次,j 分别等于 1、2、3。
在每次外部循环开始时,内部循环 for i in {1..5} 循环执行五次,i 分别等于 1、2、3、4、5。
在内部循环中,当 i 等于 3 时,执行 break 跳出循环。
在内部循环中,使用 echo "$i" 打印当前的数字序列。
在内部循环执行完毕后,外部循环继续执行,直到执行完三次为止
1
2
1
2
1
2

break 和 continue命令的作用总结

  • break:在循环内部,当执行到 break 命令时,会立即跳出当前的循环,停止循环执行,然后继续执行下一条指令。可以使用 break 命令来提前终止循环,例如当达到特定条件时或者已经执行了足够的次数。
  • continue:在循环内部,当执行到 continue 命令时,会跳过本次循环剩余的代码,并继续下一次循环。可以使用 continue 命令来跳过循环中的某些操作,例如在特定条件下跳过一次循环,或者只执行符合条件的循环。
  • 在嵌套循环中,可以在 break 和 continue 命令后面指定数字参数,来指定跳出或跳过多层循环。例如,break 2 会跳出当前循环和外层循环的迭代,而continue 2会跳过当前循环和两层外层循环的迭代。
  • break和continue命令是控制循环流程重要命令。
补充:
set -x 开启调试模式
set +x 关闭调试模式

while循环

解释

while循环满足条件执行,不满足不执行

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

基本格式

while   [ 判断条件]  

do       

执行动作   while循环执行动作

done         while循环结束标志   while true 

举例:
vim  b.sh               #创建脚本b.sh
脚本内容:
#!/bin/bash
i=0
while [ $i -le 5  ]     #变量i小于等于5时执行while循环
do
echo "$i"               #循环执行内容,每循环一次打印$i
let i++                 #每循环一次计算一次i++即i自己+1
done                    #while语句结束标志 
sh b.sh                 #调用bash执行b.sh脚本
执行结果:
0
1
2
3
4
5

while的循环方式:

#!/bin/bash
i=0
sum=0
while [ $i -le 100 ]
do
sum=$[$i+$sum]
let i++
done
echo $sum

##############批量建立用户##################################

#!/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=1

while true
do
read -p "请输入商品的价格1-1000:" num
let t++
if [ $num -eq $p ]
then
echo "恭喜你猜中了,实际价格是$p"
echo "您一共猜了${t}次"
break
elif [ $num -gt $p ]
then
echo "您猜的价格高了" 
else
echo "您猜的价格低了"
fi
done

用户输入密码,脚本判断密码是否正确,正确密码为123456,输入正确提示正确信息,连续输错3次则报警

#!/bin/bash
i=1
psd=123456
while [ $i -le 3  ]
do
read -p "请输入验证密码:"  key
[ "$key" =  "$psd"     ]
if [ $? -eq 0  ];then
    let i+=5
else
   echo "输入错误!"    
   let i++
fi
done
 
if [ $i -eq 4  ];then
  echo "密码输出错误次数超过三次!已经锁定!"
else
  echo "密码输入正确!"  
fi

死循环语句

while  [1  -eq  1]   判断条件写一个永久为真的条件 

   do       一直执行do内的命令

done

while  true        直接写判断条件为真

   do       一直执行do内的命令

   done

while :         判断条件为冒号也表示死循环

   do       一直执行do内的命令

   done

until循环

基本格式

until循环通常用于当判断条件不成立时才进行循环,一旦判断条件成立,就终止循环,
比如等待某个进程退出、等待某个文件被创建等等

格式:

until  [ 条件测试操作 ]
do
	判断式/命令序列
done
[root@localhost opt]# vim until.sh
i=0
sum=0
until [ $i -gt 10 ]
do
echo $i
let i++
sum=$(($sum+$i))
done

常用循环脚本实例

循环打印9*9乘法表

思路:
  1. 第一步for循环打印一行9个*号
  2. 第二步再添加一个for循环打印一个9行9列的*号正方形
  3. 第三步将号正方形斜砍一般形成99乘法表的基本格式
  4. 第四步将号99乘法表格式用乘法算式替换
第一步:
vim 99.sh              #创建99.sh脚本
脚本内容:
#!/bin/bash
for i in {1..9}        #for循环9次从i=1开始
do
echo -n "*"            #每循环一次打印一个*,echo  -n参数表示不换行
done                   #此for循环语句结束
bash  99.sh            #调用shell执行脚本
执行结果:
*********
########################################################################
第二步:
vim 99.sh              #编辑99.sh脚本
脚本内容:
#!/bin/bash
for  i  in  {1..9}     #添加打印列循环,循环9次从i=1开始  
do                     #j循环时做do中的内容    
    for j in {1..9}    #第一步for循环内容不变
    do
    echo -n "*"
    done
echo                   #列循环每循环一次进行换行
done                   #列循环for语句结束标志
bash  99.sh            #调用shell执行脚本
执行结果:
*********
*********
*********
*********
*********
*********
*********
*********
*********
########################################################################
第三步:
第三步将*号正方形斜砍一般形成9*9乘法表的基本格式
vim 99.sh                
脚本内容:
#!/bin/bash
for i in {1..9}               #行循环内容不变  
do                         
    for ((j=1; j<=i; j++))    #修改行循环j的取值范围为展开变量j,即当j=1时i取值只有1,所以循环一次。当 
                               j=2时,i取值为1和2,所以i=1和i=2各循环一次,循环2次。以此类推到j=9
    do
    echo -n "*"
    done
echo                   
done                   
bash  99.sh            #调用shell执行脚本
执行结果:
*
**
***
****
*****
******
*******
********
*********
########################################################################
第四步:
vim 99.sh              
脚本内容:
#!/bin/bash
for  i  in  {1..9}                  #列循环内容不变  
do
    for ((j=1; j<=i; j++))
    do
    echo -ne "$i*$j=$[ $i*$j ]\t"   #行输出内容修改为9*9算式和结果。$[ ]表示计算里面的正整数结 
                                    果,echo -e参数表示调用转义符,\t表示制表符即循环时输出一个tab键
    done
echo                   
done                   
bash  99.sh            #调用shell执行脚本
输出结果:
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

<=i; j++))
do
echo -ne “ i ∗ i* ij=$[ i ∗ i* ij ]\t” #行输出内容修改为99算式和结果。$[ ]表示计算里面的正整数结
果,echo -e参数表示调用转义符,\t表示制表符即循环时输出一个tab键
done
echo
done
bash 99.sh #调用shell执行脚本
输出结果:
1
1=1
21=2 22=4
31=3 32=6 33=9
4
1=4 42=8 43=12 44=16
5
1=5 52=10 53=15 54=20 55=25
61=6 62=12 63=18 64=24 65=30 66=36
71=7 72=14 73=21 74=28 75=35 76=42 77=49
8
1=8 82=16 83=24 84=32 85=40 86=48 87=56 88=64
9
1=9 92=18 93=27 94=36 95=45 96=54 97=63 98=72 99=81


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值