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=trueread -p "请输入一个数据值: " layer_num# 通过在循环内部进行数据操作判断是否是数据while $flag;doexpr $layer_num + 0 > /dev/null 2>&1if [ $? -eq 0 ]thenflag=falseelseread -p "请输入一个数据值: " layer_numfidone
}# 定制一个数组
declare -a num_arraycheck_int
# 定制杨辉三角的行数变量 row
for(( row=1; row<=layer_num; row++ ))
do#打印杨辉三角的左侧空白for k in $(seq $[$layer_num - $row])doecho -n " "done# 定制每行的数据获取for(( col=1; col<=row; col++ ))do# 第n行的第1个和第n行的第n个数字为1if [ $col -eq 1 -o $row -eq $col ]then# 设定每行的两个边界数字为1num_array[$row$col]=1else# 获取上一行的两个临近数据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}]}fidone# 打印每行的数据for(( col=1; col<=row; col++ ))doprintf "%-8s" ${num_array[$row$col]}doneecho
done
脚本执行效果
[root@localhost ]# /bin/bash yanghui_triangle.sh
请输入一个数据值: 811 11 2 11 3 3 11 4 6 4 11 5 10 10 5 11 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=trueread -p "请输入一个数据值(q退出): " layer_num[ $layer_num == "q" ] && exit# 通过在循环内部进行数据操作判断是否是数据while $flag;doexpr $layer_num + 0 > /dev/null 2>&1if [ $? -eq 0 ]thenflag=falseelseread -p "请输入一个数据值: " layer_numfidone
}# 定制左侧空格打印逻辑
left_blank_func(){# 获取参数值layer_num=$1row=$2# 空格打印逻辑for k in $(seq $[$layer_num - $row])doecho -n " "done
}# 获取每行的数据值
col_num_count(){# 获取参数值row=$1# 数据获取逻辑 for(( col=1; col<=row; col++ ))do# 第n行的第1个和第n行的第n个数字为1if [ $col -eq 1 -o $row -eq $col ]then# 设定每行的两个边界数字为1num_array[$row$col]=1else# 获取上一行的两个临近数据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}]}fidone
}
# 每行数据打印逻辑
col_num_print(){# 获取参数值row=$1# 数据打印逻辑for(( col=1; col<=row; col++ ))doprintf "%-8s" ${num_array[$row$col]}doneecho
}
while true
docheck_int# 定制杨辉三角的行数变量 rawfor(( row=1; row<=layer_num; row++ ))do#打印杨辉三角的左侧空白left_blank_func $layer_num $row# 获取数据的值col_num_count $row# 打印每行的所有数据col_num_print $rowdone
done
[root@localhost ~]# /bin/bash yanghui_triangle.sh
请输入一个数据值(q退出): 511 11 2 11 3 3 1
1 4 6 4 1
请输入一个数据值(q退出): q
[root@localhost ~]#
小结