内容预知
1.双重循环的介绍与运用
1.1 双重循环的理解
对于一些重复性动作我们可以用单层循环来满足重复性操作的需求,当这些重复性操作有了别的分支操作时,便不是一个变量就能够解决问题,所以我们要再引入一层循环,让操作的输出结果更见详细化或者是通过一个脚本满足更为复杂的循环需求
1.2 双重循环的机制
单层循环:执行命令从上至下依次执行命令,进行条件判断,如果没有达到退出循环的要求,
便再次进行该操作
双重循环:循环中嵌套循环(在这里我们将外面的循环称作外部循环,嵌套在里面的叫内部循环)
当外部循环执行一次时,内部循环就要将自身的所有循环进行一遍,一整个双重循环结束后,内部循环执行的次数等于自己本身循环的所有次数乘以外部循环的所有循环次数
运用演示:
#!/bin/bash
#这是一个双重循环的测试实验
for ((i=1;i<=5;i++))
do
echo "=============这是外部循环执行的第 $i 次==================== "
for ((a=1;a<=5;a++))
do
echo "这是内部循环执行的第 $a 次"
done
done
结果执行:
1.3 简单运用 :双重循环打印九九乘法表
#!/bin/bash
i=1
while [ $i -le 9 ]
do
a=1
while [ $a -le $i ]
do
echo -n -e "$a*$i=$[i*a]\t"
let a++
done
let i++
echo ""
done
结果测试:
2.循环的结束语句
2.1循环结束语句的介绍
shell脚本常用的循环语句有三种:exit continue break
正常的循环情况下for循环和while循环是只要条件符合就会一直循环下去,而until循环是只要条件不成立,就会一直循环。但是有时我们利用循环并不想要循环输出的全部结果,而是需要它的一部分结果时,这时便引入了结束语句来帮助我们获取指定范围内的循环输出结果,或者是让原本的死循环合理退出
2.2 break 语句
1)break 的默认作用是退出单层循环
运用演示
结果测试:
2)但是当break后面跟上了数字以后,数字为多少时,就会退出多少层循环
运用演示:
结果测试:
2.3 exit 语句
1)exit的默认作用时直接结束脚本进程,到此代表着脚本的结束
运用演示
测试结果:
2)exit 后面跟上数字后 代表着结束该进程并且将该数字修改为新的返回码(代替$?中要输出的值)
运用演示:
测试结果:
3.双重循环之花式打印图形
3.1 单层循环,点到线的打印
3.1.1 用星星符号打印一条横线
#!/bin/bash
i=1
while [ $i -le 9 ];
do
echo -n '*'
let i++
done
echo ""
输出结果:
3.1.2 用星号打印出一条竖线
#!/bin/bash
i=1
while [ $i -le 9 ]
do
echo "*"
let i++
done
输出结果:
3.2 双重循环,线构成面的打印
3.2.1 实心矩形打印
#!/bin/bash
i=1
while [ $i -le 9 ]
do
a=1
while [ $a -le 9 ]
do
echo -n '*'
let a++
done
echo ""
let i++
done
输出结果:
3.2.2 打印空心的的矩形
#!/bin/bash
i=1
while [ $i -le 9 ]
do
a=1
while [ $a -le 9 ]
do
if [ $i -eq 1 -o $i -eq 9 ];then
echo -n '*'
else
if [ $a -eq 1 -o $a -eq 9 ];then
echo -n "*"
else
echo -n " "
fi
fi
let a++
done
echo ""
let i++
done
输出结果:
3.2.3 打印平行四边形
3.3 双重循环构造直角三角形
3.3.1 构造直角三角形
#!/bin/bash
i=1
while [ $i -le 9 ]
do
a=1
while [ $a -le $i ]
do
echo -n '*'
let a++
done
echo ""
let i++
done
输出结果:
3.3.2 构造倒立直角三角形
#!/bin/bash
i=1
while [ $i -le 9 ]
do
a=9
while [ $a -ge $i ]
do
echo -n '*'
let a--
done
echo ""
let i++
done
输出结果:
3.4 打印等腰三角形
3.4.1 数学法答应等腰三角形
#!/bin/bash
#用数学公式打印等腰三角形
i=1
while [ $i -le 9 ]
do
a=9
while [ $a -ge $i ]
do
echo -n ' '
let a--
done
b=$[(i*2)-1]
c=1
while [ "$c" -le "$b" ]
do
echo -n '*'
let c++
done
let i++
echo ""
done
输出结果:
3.4.2 拼接法拼出等腰三角形
#用图形拼接出等腰三角形
i=1
while [ $i -le 9 ]
do
a=9
while [ $a -ge $i ]
do
echo -n ' '
let a--
done
b=1
while [ $b -le $i ]
do
echo -n '*'
let b++
done
c=2
while [ $c -le $i ]
do
echo -n '*'
let c++
done
let i++
echo ""
done
输出结果:
3.4.3 数学法打印倒立等腰三角形
# 数学表达法打印倒等腰三角形
d=9
while [ $d -ge 1 ]
do
e=9
while [ $e -ge $d ]
do
echo -n ' '
let e--
done
f=$[(2*d)-1]
g=1
while [ $g -le $f ]
do
echo -n '*'
let g++
done
let d--
echo ""
done
输出结果:
3.5 拼接法打印平行四边形
#!/bin/bash
i=1
while [ $i -le 9 ]
do
b=1
while [ $b -le $i ]
do
echo -n ' '
let b++
done
a=1
while [ $a -le 9 ]
do
echo -n '*'
let a++
done
echo ""
let i++
done
~
输出结果:
同理:先打印一个空格填充的倒立直角三角形在打印一个矩形
就可以得到不同方向的平行四边形
3.6 打印梯形
3.6.1 直角梯形
#!/bin/bash
i=1
while [ $i -le 9 ]
do
a=1
while [ $a -le 9 ]
do
echo -n '*'
let a++
done
b=1
while [ $b -le $i ]
do
echo -n '*'
let b++
done
let i++
echo ""
done
输出结果:
同理:一个空格填满的倒立直角三角形,接星号填满的剩余矩形部分,再加上另一个矩形
即可形成换方向的直角梯形
3.6.2 等腰梯形
方法一:
上面两个不同方向的直角梯形拼接即可
方法二:
等腰三角形,起始行进行改变即可(数学方法:等腰三角形切割掉顶角就是等腰梯形)
3.7 打印 菱形
3.7.1 菱形拼接(上半部分用拼接法,下半部分用数学法)
#!/bin/bash
#使用拼接法加数学表达法实现菱形的打印
#上半部分为图形拼接的等腰三角形
i=1
while [ $i -le 9 ]
do
a=9
while [ $a -ge $i ]
do
echo -n ' '
let a--
done
b=1
while [ $b -le $i ]
do
echo -n '*'
let b++
done
c=2
while [ $c -le $i ]
do
echo -n '*'
let c++
done
echo ""
let i++
done
#下半部分为 数学表达法的倒等腰三角形
d=8
while [ $d -ge 1 ]
do
e=9
while [ $e -ge $d ]
do
echo -n ' '
let e--
done
f=$[(2*d)-1]
g=1
while [ $g -le $f ]
do
echo -n '*'
let g++
done
let d--
echo ""
done
输出结果:
3.7.2 输出可调控大小的菱形
中心思维:把原本定好的行数改变成一个变量,下半部分倒立的等腰三角形变为变量减一即可
#!/bin/bash
#使用拼接法加数学表达法实现菱形的打印
#上半部分为图形拼接的等腰三角形
read -p "请输入数字来控制菱形的大小,建议范围在(8-20)" num
i=1
while [ $i -le $num ]
do
a=$num
while [ $a -ge $i ]
do
echo -n ' '
let a--
done
b=1
while [ $b -le $i ]
do
echo -n '*'
let b++
done
c=2
while [ $c -le $i ]
do
echo -n '*'
let c++
done
echo ""
let i++
done
#下半部分为 数学表达法的倒等腰三角形
d=$[num-1]
while [ $d -ge 1 ]
do
e=$num
while [ $e -ge $d ]
do
echo -n ' '
let e--
done
f=$[(2*d)-1]
g=1
while [ $g -le $f ]
do
echo -n '*'
let g++
done
let d--
echo ""
done
测试结果: