目录
1、双层循环中的基本思路
外层循环每执行一次,内层循环都要全部执行完毕后,下一次外层循环才能再执行
#!/bin/bash
#外层循环
for ((i=1;i<=3;i++))
do
echo "outer 1oop:$i"
#内层循环,看作外层循环的一个命令语句
for ((j=1;j<=3;j++))
do
echo " inter loop:$j"
done
done
outer 1oop:1
inter loop:1
inter loop:2
inter loop:3
outer 1oop:2
inter loop:1
inter loop:2
inter loop:3
outer 1oop:3
inter loop:1
inter loop:2
inter loop:3
2、exit、break、continue
2.1 exit
退出shell脚本进程,exit执行后,脚本后面的所有语句都不会执行
[root@localhost demo]# vim xun.sh
#!/bin/bash
#外层循环
for ((i=1;i<=3;i++))
do
echo "outer 1oop:$i"
#内层循环,看作外层循环的一个命令语句
for ((j=1;j<=3;j++))
do
echo " inter loop:$j"
if [ $j -eq 3 ];then
#直接退出脚本 j=3的时候即内层循环执行3次 就直接退出脚本,不会进入下一轮的外层循环
exit
fi
done
done
[root@localhost demo]# bash xun.sh
outer 1oop:1
inter loop:1
inter loop:2
inter loop:3
2.2break
跳出当前循环跳,break 2 跳出两层循环(双层循环),循环内break后面的语句不会执行,但是不会影响循环外面的语句
[root@localhost demo]# vim xun.sh
#!/bin/bash
#外层循环
for ((i=1;i<=3;i++))
do
echo "outer 1oop:$i"
#内层循环,看作外层循环的一个命令语句
for ((j=1;j<=3;j++))
do
echo " inter loop:$j"
if [ $j -eq 2 ];then
#跳出当前循环(单层循环)
break
fi
done
done
[root@localhost demo]# bash xun.sh
outer 1oop:1
inter loop:1
inter loop:2
outer 1oop:2
inter loop:1
inter loop:2
outer 1oop:3
inter loop:1
inter loop:2
- break 2
[root@localhost demo]# vim xun.sh
#!/bin/bash
#外层循环
for ((i=1;i<=3;i++))
do
echo "outer 1oop:$i"
#内层循环,看作外层循环的一个命令语句
for ((j=1;j<=3;j++))
do
echo " inter loop:$j"
if [ $j -eq 2 ];then
#跳出两次循环
break 2
fi
done
done
echo "123"
[root@localhost demo]# bash xun.sh
outer 1oop:1
inter loop:1
inter loop:2
123
2.3continue
终止某次循环的执行,但不会完全终止整个循环,while和until循环中使用需要慎重 ,因为如果continue放在变量迭代语句前会造成死循环
[root@localhost demo]# vim xun.sh
#!/bin/bash
#外层循环
for ((i=1;i<=3;i++))
do
echo "outer 1oop:$i"
#内层循环,看作外层循环的一个命令语句
for ((j=1;j<=3;j++))
do
if [ $j -eq 2 ];then
#结束j=2的循环 继续执行下一次的循环
continue
fi
echo " inter loop:$j"
done
done
[root@localhost demo]# bash xun.sh
outer 1oop:1
inter loop:1
inter loop:3
outer 1oop:2
inter loop:1
inter loop:3
outer 1oop:3
inter loop:1
inter loop:3
3、99乘法表
- 使用for循环
[root@localhost demo]# vim chengfabiao.sh
#!/bin/bash
#外层循环i控制行
for ((i=1; i<=9; i++))
do
#内层循环j控制列,列数小于等于行数的时候执行for循环
for ((j=1; j<=$i; j++))
do
#乘法表的结果为行数代表的值*列数代表的值
let sum=i*j
#不换行且使用tab制表符进行分隔
echo -n -e "$j*$i=$sum\t"
done
#没执行完内层循环就换行输出
echo ""
done
[root@localhost demo]# bash chengfabiao.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
- 使用while循环
root@localhost demo]# vim chengfabiao.sh
#!/bin/bash
#外层循环i控制行
i=0
while [ $i -lt 9 ]
do
let i++
#内层循环j控制列
j=0
#当列数小于行数执行while语句
while [ $j -lt $i ]
do
let j++
#乘法表的结果为行数代表的值*列数代表的值
let sum=i*j
#不换行且使用tab制表符进行分隔
echo -n -e "$j*$i=$sum\t"
done
#没执行完内层循环就换行输出
echo ""
done
[root@localhost demo]# bash chengfabiao.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、输出直线
[root@localhost demo]# vim zhixian.sh
#!/bin/bash
#输出直线
for ((a=1;a<=20;a++))
do
#不换行输出*
echo -n "*"
done
#循环结束后换行输出
echo ""
[root@localhost demo]# bash zhixian.sh
********************
5、输出矩形
5.1实心矩形
[root@localhost demo]# vim shixinjuxing.sh
#!/bin/bash
#外循环控制行
for ((a=1;a<=10;a++))
do
#内循环控制列
for ((b=1;b<=20;b++))
do
#不换行输出*
echo -n "*"
done
#每次内循环结束后换行输出
echo ""
done
[root@localhost demo]# bash shixinjuxing.sh
********************
********************
********************
********************
********************
********************
********************
********************
********************
********************
5.2空心矩形
[root@localhost demo]# vim kxjx.sh
#!/bin/bash
#矩形长20,宽10
#空心的,第一行和最后一行输出20个*,其它行先输出一个*再输出18个空格,最后再输出一个*
#控制行数
for ((a=1; a<=10; a++))
do
#行数为1或者为10的时候
if [ $a -eq 1 -o $a -eq 10 ] ; then
#从第一列到第20列全部输出*
for ((b=1; b<=20; b++))
do
#不换行输出*
echo -n "*"
done
else #不是第1列或者第20列的时候就进行下面的操作
#不换行输出*
echo -n "*"
#使用for循环在每一行的*后面输出18个空格
for c in {1..18}
do
echo -n " "
done
#在每一行的空格后面输出*
echo -n "*"
fi
#每次的内循环结束后进行换行操作
echo ""
done
[root@localhost demo]# bash kxjx.sh
********************
* *
* *
* *
* *
* *
* *
* *
* *
********************
6、三角形
6.1右直角三角形
与99乘法表思路相同
[root@localhost demo]# vim zysj.sh
#!/bin/bash
#右直角三角形
for ((a=1; a<=9; a++))
do
for ((b=1; b<=$a; b++))
do
echo -n "*"
done
echo ""
done
[root@localhost demo]# bash zysj.sh
*
**
***
****
*****
******
*******
********
*********
6.2倒直角三角形
[root@localhost demo]# vim zysj.sh
#!/bin/bash
#倒直角三角形
for ((a=1; a<=9; a++))
do
for ((b=9; b>=a; b--))
do
echo -n "*"
done
echo ""
done
[root@localhost demo]# bash zysj.sh
*********
********
*******
******
*****
****
***
**
*
6.3反直角三角形
[root@localhost demo]# vim zjsj.sh
#!/bin/bash
#反直角三角形(一个倒空格三角与反直角三角拼凑)
for ((a=1; a<=9; a++))
do
#生成一个空格填充的倒直角三角形
for ((b=9; b>=a; b--))
do
echo -n " "
done
#生成一个*构成的反三角
for ((c=1; c<=a; c++))
do
echo -n "*"
done
echo ""
done
[root@localhost demo]# bash zjsj.sh
*
**
***
****
*****
******
*******
********
*********
6.4等腰三角形
[root@localhost demo]# vim dy.sh
#!/bin/bash
#等腰三角形(空格倒三角+*反三角+*正三角)
for ((a=1; a<=9; a++))
do
#生成一个空格填充的倒直角三角形
for ((b=9; b>=a; b--))
do
echo -n " "
done
#生成一个*构成的反三角
for ((c=1; c<=a; c++))
do
echo -n "*"
done
#生成一个*构成的正三角
for ((d=2; d<=a; d++))
do
echo -n "*"
done
echo ""
done
[root@localhost demo]# bash dy.sh
*
***
*****
*******
*********
***********
*************
***************
*****************
方法二:算数法
#!/bin/bash
#等腰三角形(空格倒三角+*反三角+*三角)
for ((a=1; a<=9; a++))
do
#输出空倒三角
for ((b=9 ; b>=a; b--))
do
echo -n " "
done
#计算每行应i该输出几个*
i=$[(a * 2) - 1] #如第一行输出 1*2-1=1个星
#输出*
for ((h=1 ; h<=i ; h++))
do
echo -n "*"
done
echo ""
done
6.5等腰倒三角
[root@localhost demo]# vim dy.sh
#!/bin/bash
#等腰三角形(空格直三角+*倒三角+*倒三角)
for ((a=1; a<=9; a++))
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 ""
done
[root@localhost demo]# bash dy.sh
*****************
***************
*************
***********
*********
*******
*****
***
*
7、菱形
[root@localhost demo]# vim lx.sh
#!/bin/bash
#输出菱形
#等腰三角
for ((a=1; a<=9; a++))
do
#输出空倒三角
for ((b=9 ; b>=a; b--))
do
echo -n " "
done
#计算每行应i该输出几个*
i=$[(a * 2) - 1] #如第一行输出 1*2-1=1个星
#输出*
for ((h=1 ; h<=i ; h++))
do
echo -n "*"
done
echo ""
done
#生成等腰倒三角
for ((a=2; a<=9; a++))
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 ""
done
[root@localhost demo]# bash lx.sh
*
***
*****
*******
*********
***********
*************
***************
*****************
***************
*************
***********
*********
*******
*****
***
*