shell脚本编程实践(五)
1 流程控制
1.1 函数进阶
1.1.1 函数嵌套
基础知识
简介
所谓的函数嵌套,主要是在函数间或者文件间相互使用的一种方式。它主要有三种样式:
样式1:函数间调用- 函数体内部调用其他的函数名
样式2:文件间调用- 函数体内部调用另外一个文件的函数名- 需要额外做一步文件source的加载动作注意:我们将专门提供函数的文件称为 -- 函数库
样式3:函数自调用- 函数体内部调用自己的函数名,将复杂的逻辑简单化
简单实践
函数间调用实践1-图形信息打印
按照信息提示,分别打印 三角形 和 等腰梯形* ****** * ******** * * ********** * * * ************ * * * * *************
[root@localhost ~]# cat function_drawn_graph.sh
#!/bin/bash
# 功能:打印相关图形
# 版本:v0.2
# 作者:书记
# 联系:www.superopsmsb.comgraph_type=(三角形 梯形)
# 定制服务的操作提示功能函数
menu(){echo -e "\e[31m---------------查看可以绘制的图形---------------"echo -e " 1: 三角形 2: 梯形"echo -e "-------------------------------------------\033[0m"
}# 定制打印左侧空格效果
left_bland_func(){layer_num="$1"sub_num="$2"for m in $(seq $[${layer_num}-${sub_num}]);doecho -n " "done
}# 打印图形的核心内容部分
kernel_character_func(){char_num="$1"char_mark="$2"for j in $(seq ${char_num});doecho -n "${char_mark}"done
}
# 定制打印三角形的函数
triangle_func(){# 接收函数传参layer_num=$1# 定制打印n层的三角形for i in $(seq 1 ${layer_num});do# 定制打印三角形左侧的空格效果left_bland_func ${layer_num} $i# 定制打印三角形核心部分kernel_character_func $i "* "# 打印完每行就换行echodone
}
# 定制梯形的功能函数
trapezium_func(){print_num=${layer_num}for i in $(seq 1 ${layer_num});do# 定制打印梯形左侧的空格效果left_bland_func ${layer_num} $i# 定制打印梯形核心部分kernel_character_func $print_num "*"let print_num+=2echodone
}
# 选择服务操作类型
while true;domenuread -p "> 请输入要查看的资源信息类型: " graph_idcase ${graph_type[$graph_id-1]} in"三角形")read -p "> 请输入三角形绘制的层数: " layer_numtriangle_func ${layer_num};;"梯形")read -p "> 请输入梯形绘制的层数: " layer_num# 定制打印n层的梯形trapezium_func ${layer_num};;*)echo -e "\e[31m\t请输入正确的绘图类型id\e[0m";;esac
done
脚本执行后效果
[root@localhost ~]# /bin/bash function_drawn_graph.sh
---------------查看可以绘制的图形---------------1: 三角形 2: 梯形
-------------------------------------------
> 请输入要查看的资源信息类型: 1
> 请输入三角形绘制的层数: 5** ** * ** * * *
* * * * *
---------------查看可以绘制的图形---------------1: 三角形 2: 梯形
-------------------------------------------
> 请输入要查看的资源信息类型: 2
> 请输入梯形绘制的层数: 5********************************
*************
---------------查看可以绘制的图形---------------1: 三角形 2: 梯形
-------------------------------------------
> 请输入要查看的资源信息类型: ^C
[root@localhost ~]#
文件间调用实践2-拆分function_drawn_graph.sh脚本
需求:拆分绘图脚本文件1 将脚本文件中的功能逻辑函数拆分出来以单独的文件存在2 脚本文件保留核心逻辑功能
创建功能函数库文件目录
[root@localhost ~]# mkdir lib查看库文件内容
[root@localhost ~]# cat lib/drawn_func.sh
#!/bin/bash
# 功能:打印相关图形功能函数库
# 版本:v0.1
# 作者:书记
# 联系:www.superopsmsb.com# 定制服务的操作提示功能函数
menu(){echo -e "\e[31m---------------查看可以绘制的图形---------------"echo -e " 1: 三角形 2: 梯形"echo -e "-------------------------------------------\033[0m"
}# 定制打印三角形左侧空格效果
left_bland_func(){layer_num="$1"sub_num="$2"for m in $(seq $[${layer_num}-${sub_num}]);doecho -n " "done
}# 打印图形的核心内容部分
kernel_character_func(){char_num="$1"char_mark="$2"for j in $(seq ${char_num});doecho -n "${char_mark}"done
}
# 定制打印三角形的函数
triangle_func(){# 接收函数传参layer_num=$1# 定制打印n层的三角形for i in $(seq 1 ${layer_num});do# 定制打印三角形左侧的空格效果left_bland_func ${layer_num} $i# 定制打印三角形核心部分kernel_character_func $i "* "# 打印完每行就换行echodone
}
# 定制梯形的功能函数
trapezium_func(){print_num=${layer_num}for i in $(seq 1 ${layer_num});do# 定制打印梯形左侧的空格效果left_bland_func ${layer_num} $i# 定制打印梯形核心部分kernel_character_func $print_num "*"let print_num+=2echodone
}
查看脚本框架文件
[root@localhost ~]# cat function_drawn_graph-lib.sh
#!/bin/bash
# 功能:打印相关图形
# 版本:v0.3
# 作者:书记
# 联系:www.superopsmsb.com# 定制数组变量
graph_type=(三角形 梯形)# 加载功能函数库文件
source ./lib/drawn_func.sh# 选择服务操作类型
while true;domenuread -p "> 请输入要查看的资源信息类型: " graph_idcase ${graph_type[$graph_id-1]} in"三角形")read -p "> 请输入三角形绘制的层数: " layer_numtriangle_func ${layer_num};;"梯形")read -p "> 请输入梯形绘制的层数: " layer_num# 定制打印n层的梯形trapezium_func ${layer_num};;*)echo -e "\e[31m\t请输入正确的绘图类型id\e[0m";;esac
done
脚本执行效果
[root@localhost ~]# /bin/bash function_drawn_graph-lib.sh
---------------查看可以绘制的图形---------------1: 三角形 2: 梯形
----