1.1.3 综合练习
学习目标
这一节,我们从 案例解读、脚本实践、小结 三个方面来学习。
案例解读
案例需求
使用shell脚本绘制一个杨辉三角
案例解读
1、每行数字左右对称,从1开始变大,然后变小为1。
2、第n行的数字个数为n个,所有数字和为 2^(n-1)。
3、每个数字等于上一行的左右临近两个数字之和。
4、第n行的数字依次为 1、1×(n-1)、1×(n-1)×(n-2)/2、1×(n-1)×(n-2)/2×(n-3)/3 ...
...
脚本实践
脚本实践
查看脚本内容
[root@localhost ~]# cat yanghui_triangle.sh
#!/bin/bash
# 功能:shell定制杨辉三角功能
# 版本:v0.1
# 作者:书记
# 联系:www.superopsmsb.com
# 判断输入是否为整数
check_int(){
# 设定数据标识
flag=true
read -p "请输入一个数据值: " layer_num
# 通过在循环内部进行数据操作判断是否是数据
while $flag;do
expr $layer_num + 0 > /dev/null 2>&1
if [ $? -eq 0 ]
then
flag=false
else
read -p "请输入一个数据值: " layer_num
fi
done
}
# 定制一个数组
declare -a num_array
check_int
# 定制杨辉三角的行数变量 row
for(( row=1; row<=layer_num; row++ ))
do
#打印杨辉三角的左侧空白
for k in $(seq $[$layer_num - $row])
do
echo -n " "
done
# 定制每行的数据获取
for(( col=1; col<=row; col++ ))
do
# 第n行的第1个和第n行的第n个数字为1
if [ $col -eq 1 -o $row -eq $col ]
then
# 设定每行的两个边界数字为1
num_array[$row$col]=1
else
# 获取上一行的两个临近数据
let row_up=row-1 # 获取上一行的数据
let col_up=col-1 # 获取上一行的临近数据
# 获取当前行的数据值为 上一行临近数据的数据和
let num_array[$row$col]=${num_array[$row_up$col_up]}+${num_array[${row_up}${col}]}
fi
done
# 打印每行的数据
for(( col=1; col<=row; col++ ))
do
printf "%-8s" ${num_array[$row$col]}
done
echo
done
脚本执行效果
[root@localhost ]# /bin/bash yanghui_triangle.sh
请输入一个数据值: 8
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
函数嵌套改造
脚本改造后内容
[root@localhost ~]# cat yanghui_triangle.sh
#!/bin/bash
# 功能:shell定制杨辉三角功能
# 版本:v0.2
# 作者:书记
# 联系:www.superopsmsb.com
# 定制一个数组
declare -a num_array
# 判断输入是否为整数
check_int(){
# 设定数据标识
flag=true
read -p "请输入一个数据值(q退出): " layer_num
[ $layer_num == "q" ] && exit
# 通过在循环内部进行数据操作判断是否是数据
while $flag;do
expr $layer_num + 0 > /dev/null 2>&1
if [ $? -eq 0 ]
then
flag=false
else
read -p "请输入一个数据值: " layer_num
fi
done
}
# 定制左侧空格打印逻辑
left_blank_func(){
# 获取参数值
layer_num=$1
row=$2
# 空格打印逻辑
for k in $(seq $[$layer_num - $row])
do
echo -n " "
done
}
# 获取每行的数据值
col_num_count(){
# 获取参数值
row=$1
# 数据获取逻辑
for(( col=1; col<=row; col++ ))
do
# 第n行的第1个和第n行的第n个数字为1
if [ $col -eq 1 -o $row -eq $col ]
then
# 设定每行的两个边界数字为1
num_array[$row$col]=1
else
# 获取上一行的两个临近数据
let row_up=row-1 # 获取上一行的数据
let col_up=col-1 # 获取上一行的临近数据
# 获取当前行的数据值为 上一行临近数据的数据和
let num_array[$row$col]=${num_array[$row_up$col_up]}+${num_array[${row_up}${col}]}
fi
done
}
# 每行数据打印逻辑
col_num_print(){
# 获取参数值
row=$1
# 数据打印逻辑
for(( col=1; col<=row; col++ ))
do
printf "%-8s" ${num_array[$row$col]}
done
echo
}
while true
do
check_int
# 定制杨辉三角的行数变量 raw
for(( row=1; row<=layer_num; row++ ))
do
#打印杨辉三角的左侧空白
left_blank_func $layer_num $row
# 获取数据的值
col_num_count $row
# 打印每行的所有数据
col_num_print $row
done
done
[root@localhost ~]# /bin/bash yanghui_triangle.sh
请输入一个数据值(q退出): 5
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
请输入一个数据值(q退出): q
[root@localhost ~]#
小结