1、双重循环概述
-
双重循环需要具备的前提——存在两个以上的自变量。
-
执行机制:
- 循环必须是有规律的递增或递减,脚本从上至下执行。
- 在没有break、exit、continue等结束语句时,循环语句会逐条执行。外层循环每执行一次,内层循环都要全部执行完毕,下一次外层循环才能再执行。
- 可以把内层循环,看作外层循环的一个命令语句。
双重循环演示:
外层循环5次,内层循环5次。
[root@localhost ~]# vim shuang.sh
#!/bin/bash
#双层循环
#外层循环
for ((i=1;i<=5;i++))
do
echo "outer loop:$i"
#内层循环
for ((j=1;j<=5;j++))
do
echo " inner loop:$j"
done
done
2、shell脚本退出循环语句
2.1 exit
exit的作用:
退出shell脚本。exit执行后,脚本后面所有的语句都不会执行。
示例:
在内层循环的输出语句上方,增加 if 语句判断,当内存循环到达第三次时,执行exit退出脚本。
效果:外层循环只执行1次,内存循环只执行2次。
#!/bin/bash
#双层循环
#外层循环
for ((i=1;i<=5;i++))
do
echo "outer loop:$i"
#内层循环
for ((j=1;j<=5;j++))
do
#当内层循环到达第三次时,exit退出脚本
if [ $j -eq 3 ]
then
exit
fi
echo " inner loop:$j"
done
done
2.2 break
break的作用:
- 跳出单层循环,默认为break 1,后面的数字为跳出层数。例如"break 2"为跳出2层循环。
- 循环内break之后的语句都不会执行,但循环外的语句仍然会执行。
示例:
在内层循环的输出语句上方,增加 if 语句判断,当内存循环到达第三次时,执行break跳出内层循环。
效果:外层循环5次,内存循环2次。(内层循环每到达第3次时,就跳出内层循环,执行下一次外层循环。)
#!/bin/bash
#双层循环
#外层循环
for ((i=1;i<=5;i++))
do
echo "outer loop:$i"
#内层循环
for ((j=1;j<=5;j++))
do
#当内层循环到达第三次时,break跳出内层循环
if [ $j -eq 3 ]
then
break
fi
echo " inner loop:$j"
done
done
2.3 continue
continue的作用:
- 终止某次循环的执行,本次循环continue后面的语句不会执行,但不会完全终止整个循环。就是直接跳过满足条件的循环,即满足条件的不执行。
- continue一般用于for循环。在while和until中要慎用,因为如果变量迭代语句放在continue之后,那么迭代不会执行,会造成死循环。
示例:
在内层循环的输出语句上方,增加 if 语句判断,当内存循环到达第三次时,执行continue跳出本次循环。
效果:外层循环5次,内存循环跳过第3次,执行第1、2、4、5次。
#!/bin/bash
#双层循环
#外层循环
for ((i=1;i<=5;i++))
do
echo "outer loop:$i"
#内层循环
for ((j=1;j<=5;j++))
do
#当内层循环到达第三次时,continue跳过本次循环
if [ $j -eq 3 ]
then
continue
fi
echo " inner loop:$j"
done
done
3、使用双重循环花式打印图形
外层循环用于表示行数。
内层循环用于表示列数。
图形1:实心矩形
每一行打印20个星星,一共打印10行。
#!/bin/bash
#矩形,长20,宽10
for a in {1..10}
do
for b in {1..20}
do
#-n表示不换行
echo -n "*"
done
#这里的echo用于换行,因为echo默认会打印换行符
echo " "
done
[root@yuji sh]# bash hua1.sh
********************
********************
********************
********************
********************
********************
********************
********************
********************
********************
图形2:空心矩形
步骤1:第1行和第10行,输出20个星星。
步骤2:第2~9行,输出1个星星。再输出18个空格。最后再输出1个星星。
#!/bin/bash
#空心矩形,长20,宽10
#一共10行,第1行和第10行输出20个星星
#其他行输出1个星星,再输出18个空格,最后再输出1个星星
for a in {1..10}
do
#第1行和第10行,输出20个星星
if [ $a -eq 1 -o $a -eq 10 ]
then
for b in {1..20}
do
echo -n "*"
done
else
#其他行输出1个星星
echo -n "*"
#再输出18个空格
for c in {1..18}
do
echo -n " "
done
#最后再输出1个星星
echo -n "*"
fi
#用于换行,echo默认会打印换行符
echo " "
done
[root@yuji sh]# bash hua2.sh
********************
* *
* *
* *
* *
* *
* *
* *
* *
********************
图形3:直角三角形
第一行输出1个星星,
第二行输出2个星星,
第三行输出3个星星,
以次类推,
直到第九行输出9个星星。
方法一:
#!/bin/bash
#显示直角三角形
#a从1开始
for a in {1..9}
do
for b in `seq $b`
do
#-n表示不换行
echo -n "*"
done
#用于换行,echo默认打印换行符
echo
done
[root@yuji sh]# bash hua30.sh
*
**
***
****
*****
******
*******
********
*********
方法二:
#!/bin/bash
#显示直角三角形
#a从9开始
for a in {9..1}
do
for ((b=9;b>=a;b--))
do
#-n表示不换行
echo -n "*"
done
#用于换行,echo默认打印换行符
echo
done
图形4:倒直角三角形
第一行打印9个星星;
第二行打印8个星星;
第三行打印7个星星;
以此类推,
直到第九行打印1个星星。
方法一:
#!/bin/bash
#显示倒直角三角形
#a从1开始
for a in {1..9}
do
for ((b=9;b>=a;b--))
do
echo -n "*"
done
echo
done
[root@yuji sh]# bash hua4.sh
*********
********
*******
******
*****
****
***
**
*
方法二:
#!/bin/bash
#显示倒直角三角形
#a从9开始
for a in {9..1}
do
for ((b=1;b<=a;b++))
do
#-n表示不换行
echo -n "*"
done
#echo用于换行,因为echo默认会打印换行符
echo
done
图形5:反直角三角形
先输出一个空格填充的倒直角三角形,再输出一个星星填充的直角三角形。
#!/bin/bash
#反直角三角形
#先生成一个空格填充的倒直角三角形
#再生成一个星星填充的直角三角形
#a从9开始
for a in {9..1}
do
#生成一个空格填充的倒直角三角形
for ((b=1;b<=a;b++))
do
echo -n " "
done
#再生成一个星星填充的直角三角形
for ((c=9;c>=a;c--))
do
echo -n "*"
done
#用于换行,echo默认打印换行符
echo
done
[root@yuji sh]# bash hua5.sh
*
**
***
****
*****
******
*******
********
图形6:等腰三角形
方法一:
反直角三角形+正直角三角形
#!/bin/bash
#等腰三角形
#通过"反直角三角形+正直角三角形"的方式生成
for a in {9..1}
do
#生成一个空格填充的倒直角三角形
for ((b=1;b<=a;b++))
do
echo -n " "
done
#再生成一个星星填充的直角三角形
for ((c=9;c>=a;c--))
do
echo -n "*"
done
#最后生成一个星星填充的正直角三角形,从第二行开始打印
for ((d=8;d>=a;d--))
do
echo -n "*"
done
#用于换行,echo默认打印换行符
echo
done
[root@yuji sh]# bash hua06.sh
*
***
*****
*******
*********
***********
*************
***************
*****************
方法二:
先输出一个空格填充的倒直角三角形;之后输出每行的星星,每行的星星个数=行数×2-1。
#!/bin/bash
#等腰三角形
#先输出一个空格填充的倒直角三角形
#之后每行的星星个数=行数×2-1
for a in {1..9}
do
#输出一个空格填充的倒直角三角形
for ((b=9;b>=a;b--))
do
echo -n " "
done
#每行的星星个数=2a-1
i=$[(a*2)-1]
for j in `seq $i`
do
echo -n "*"
done
#用于换行,echo默认打印换行符
echo
done
图形7:倒等腰三角形
方法一:
先输出一个空格直角三角形,再输出一个星星填充的反直角三角形,最后输出一个星星填充的倒直角三角形。
#!/bin/bash
#倒等腰三角形
#先输出一个空格直角三角形
#再输出一个星星填充的反直角三角形
#最后输出一个星星填充的倒直角三角形
for a in {1..9}
do
#输出一个空格填充的直角三角形
for b in `seq 1 $a`
do
echo -n " "
done
#再输出一个星星填充的反直角三角形
for c in `seq $a 9`
do
echo -n "*"
done
#最后输出一个星星填充的倒直角三角形
for d in `seq $a 8`
do
echo -n "*"
done
#用于换行,echo默认打印换行符
echo
done
[root@yuji ~]# bash hua7.sh
*****************
***************
*************
***********
*********
*******
*****
***
*
方法二:
#!/bin/bash
#倒等腰三角形
#a从9开始
#先输出一个空格直角三角形
#之后每行的星星个数=2a-1
for a in {9..1}
do
#输出一个空格填充的直角三角形
for ((b=9;b>=a;b--))
do
echo -n " "
done
#每行的星星个数=2a-1
i=$[(a*2)-1]
for j in `seq $i`
do
echo -n "*"
done
#用于换行,echo默认打印换行符
echo
done
图形8:菱形(正等腰三角形+倒等腰三角形)
先输出一个正等腰三角形(9行);再输出一个倒等腰三角形(8行)。
#!/bin/bash
#菱形
#正等腰三角形+倒等腰三角形
#正等腰三角形,一共9行
for a in {1..9}
do
#输出一个空格填充的倒直角三角形
for ((b=9;b>=a;b--))
do
echo -n " "
done
#每行的星星个数=2a-1
i=$[(a*2)-1]
for j in `seq $i`
do
echo -n "*"
done
echo
done
#倒等腰三角形,一共8行
for a in {8..1}
do
for ((b=9;b>=a;b--))
do
echo -n " "
done
#每行的星星个数=2a-1
i=$[(a*2)-1]
for j in `seq $i`
do
echo -n "*"
done
echo
done
[root@yuji ~]# bash hua8.sh
*
***
*****
*******
*********
***********
*************
***************
*****************
***************
*************
***********
*********
*******
*****
***
*
图形9:平行四边形
方法一:
先输出一个空格填充的直角三角形,之后每行输出相同个数的星星。
#!/bin/bash
#平行四边形
#先输出一个空格填充的直角三角形
#之后每行输出相同个数的星星
for a in {1..9}
do
#输出一个空格直角三角形
for b in `seq 1 $a`
do
echo -n " "
done
#每行输出9个星星
for c in {1..9}
do
echo -n "*"
done
echo
done
[root@yuji ~]# bash hua9.sh
*********
*********
*********
*********
*********
*********
*********
*********
*********
方法二:
先输出一个空格填充的倒直角三角形,之后每行输出相同个数的星星。
#!/bin/bash
#平行四边形
#先输出一个空格填充的直角三角形
#之后每行输出相同个数的星星
for a in {1..9}
do
#输出一个空格直角三角形
for b in `seq $a 9`
do
echo -n " "
done
#每行输出9个星星
for c in {1..9}
do
echo -n "*"
done
echo
done
[root@yuji ~]# bash hua09.sh
*********
*********
*********
*********
*********
*********
*********
*********
*********
图形10:直角梯形
将平行四边形左边的空格直角三角形,变成星星直角三角形。
#!/bin/bash
#直角梯形
#使用"直角三角形+平行四边形"的方式
for a in {1..9}
do
#输出一个星星填充的直角三角形
for b in `seq 1 $a`
do
echo -n "*"
done
#每行输出9个星星
for c in {1..9}
do
echo -n "*"
done
echo
done
[root@yuji ~]# bash hua10.sh
**********
***********
************
*************
**************
***************
****************
*****************
******************
图形11:等腰梯形
先输出一个空格填充的倒直角三角形;之后输出每行的星星,每行的星星个数=n+行数×2(n为任意正整数,每一行的星星个数都比上一行多2个)。
#!/bin/bash
#等腰梯形
#先输出一个空格填充的倒直角三角形(9行)
#每行的星星个数=9+行数×2
for a in {1..9}
do
#输出一个空格填充的倒直角三角形
for ((b=9;b>=a;b--))
do
echo -n " "
done
#每行输出(9+2a)个星星
i=$[9+a*2]
for ((c=1;c<=i;c++))
do
echo -n "*"
done
echo
done
[root@yuji ~]# bash hua11.sh
***********
*************
***************
*****************
*******************
*********************
***********************
*************************
***************************