1 流程控制
1.1 for循环
1.1.1 嵌套循环
基础知识
简介
这里的嵌套实践,与选择语句的嵌套实践基本一致,只不过组合的方式发生了一些变化。常见的组合样式如下:
for嵌套for语句
for 循环列表1
do
for 循环列表2
do
...
done
done
for嵌套if|case语句
for 循环列表
do
if 条件判断语句
或
case 条件判断语句
done
if语句嵌套for语句
if 条件判断
then
for 循环列表语句
fi
case语句嵌套for语句
case 条件判断
for 循环列表语句
;;
esac
简单实践
for嵌套for语句实践1-输出99乘法表
查看脚本内容
[root@localhost ~]# cat for_nine_table.sh
#!/bin/bash
# 功能:for打印99乘法表
# 定制打印99乘法表的业务逻辑
# 对第一个位置的数字进行循环
for num1 in {
1..9}
do
# 对第二个位置的数字进行循环
for num2 in $(seq $num1)
do
# 信息输出,\t\c 的目的是删除后续信息,生成的内容是固定长度
echo -e "\e[$[RANDOM%9+31]m${num1} x ${num2} = $[num1*num2]\e[0m\t\c"
done
echo # 一个子循环一行内容
done
脚本执行效果
for嵌套if语句实践2-判断目录中的文件类型
准备工作
mkdir dir/{
server,soft,scripts,logs} -p
touch dir/{
{
a..c}.sh,{
1..3}.txt}
查看脚本内容
[root@localhost ~]# cat file_type_for_if.sh
#!/bin/bash
# 功能:for嵌套if查看目录下的文件类型
# 定制普通变量
dir_name='dir'
# 获取所有文件列表
for file in $(ls dir)
do
# 判断文件类型
if [ -d ${
dir_name}/${
file} ]
then
echo -e "\e[31m${dir_name}/${file} 是一个目录文件\e[0m"
elif [ -f ${
dir_name}/${
file} ]
then
echo -e "\e[31m${dir_name}/${file} 是一个普通文件\e[0m"
fi
done
脚本执行效果
[root@localhost ~]# /bin/bash file_type_for_if.sh
dir/1.txt 是一个普通文件
dir/2.txt 是一个普通文件
dir/3.txt 是一个普通文件
dir/a.sh 是一个普通文件
dir/b.sh 是一个普通文件
dir/c.sh 是一个普通文件
dir/logs 是一个目录文件
dir/scripts 是一个目录文件
dir/server 是一个目录文件
dir/soft 是一个目录文件
收尾动作
[root@localhost ~]# rm -rf dir
if嵌套for语句实践3-获取系统支持的shell类型
查看脚本内容
[root@localhost ~]# cat os_shell_if_for.sh
#!/bin/bash
# 功能:if嵌套for查看系统支持的shell类型
# 定制普通变量
shell_file='/etc/shells'
# 获取所有文件列表
if [ -f ${
shell_file} ]
then
for shell in $(grep sh /etc/shells)
do
echo -e "\e[31m当前系统支持的shell类型有: ${shell}\e[0m"
done
else
echo -e "\e[31m没有 ${shell_file} 文件\e[0m"
fi
脚本执行效果
[root@localhost ~]# /bin/bash os_shell_if_for.sh
当前系统支持的shell类型有: /bin/sh
当前系统支持的shell类型有: /bin/bash
当前系统支持的shell类型有: /usr/bin/sh
当前系统支持的shell类型有: /usr/bin/bash
1.1.2 综合案例
信息收集
案例需求
根据提示信息,选择输出 cpu 或者 内存信息。
脚本实践-采集系统负载信息
查看脚本内容
[root@localhost ~]# cat systemctl_load.sh
#!/bin/bash
# 功能:采集系统负载信息
# 版本:v0.2
# 作者:书记
# 联系:www.superopsmsb.com
# 定制资源类型
resource_type=(CPU MEM)
cpu_attribute=(1 5 15)
free_attribute=(总量 使用 空闲)
# 获取相关的属性信息
cpu_load=($(uptime | tr -s " " | cut -d " " -f 11-13 | tr "," " "))
free_info=($(free -m | grep Mem | tr -s " " | cut -d " " -f 2-4))
# 服务的操作提示
echo -e "\e[31m---------------查看资源操作动作---------------
1: CPU 2: MEM
-------------------------------------------"'\033[0m'
# 选择服务操作类型
read -p "> 请输入要查看的资源信息类型: " resource_id
echo
if [ ${
resource_type[$resource_id-1]} == "CPU" ]
then
echo -e "\e[31m\t系统CPU负载信息\e[0m"
echo -e "\e[32m================================"
for index in ${
!cpu_attribute[@]}
do
echo "CPU ${cpu_attribute[$index]} min平均负载为: ${cpu_load[$index]}"
done
echo -e "================================\e[0m"
elif [ ${
resource_type[$resource_id-1]} == "MEM" ]
then
echo -e "\e[31m\t系统内存负载信息\e[0m"
echo -e "\e[32m================================"
for index in ${
!free_attribute[@]}
do
echo "内存 ${free_attribute[$index]} 信息为: ${free_info[$index]} M"
done
echo -e "================================\e[0m"
fi
脚本使用效果
[root@localhost ~]# /bin/bash systemctl_load.sh
---------------查看资源操作动作---------------
1: CPU 2: MEM
-------------------------------------------
> 请输入要查看的资源信息类型: 1
系统CPU负载信息
================================
CPU 1 min平均负载为: 0.00
CPU 5 min平均负载为: 0.01
CPU 15 min平均负载为: 0.05
================================
[root@localhost ~]# /bin/bash systemctl_load.sh
---------------查看资源操作动作---------------
1: CPU 2: MEM
-------------------------------------------
> 请输入要查看的资源信息类型: 2
系统内存负载信息
================================
内存 总量 信息为: 3770 M
内存 使用 信息为: 247 M
内存 空闲 信息为: 3302 M
================================
其他实践
需求
按照信息提示,分别打印 三角形 和 等腰梯形
* *****
* * *******
* * * *********
* * * * ***********
* * * * * *************
脚本内容
[root@localhost ~]# cat drawn_graph.sh
#!/bin/bash
# 功能:打印相关图形
# 版本:v0.1
# 作者:书记
# 联系:www.superopsmsb.com
graph_type=(三角形 梯形)
# 服务的操作提示
echo -e "\e[31m---------------查看可以绘制的图形---------------
1: 三角形 2: 梯形
-------------------------------------------"'\033[0m'
# 选择服务操作类型
read -p "> 请输入要查看的资源信息类型: " graph_id
case ${
graph_type[$graph_id-1]} in
"三角形")
read -p "> 请输入三角形绘制的层数: " layer_num
# 定制打印n层的三角形
for i in $(seq 1 ${
layer_num});do
# 定制打印三角形左侧的空格效果
for m in $(seq $[${
layer_num}-$i]);do
echo -n " "
done
# 定制打印三角形核心部分
for j in $(seq $i);do
echo -n "* "
done
# 打印完每行就换行
echo
done;;
"梯形")
read -p "> 请输入梯形绘制的层数: " layer_num
# 定制打印n层的梯形
print_num=${
layer_num}
for i in $(seq 1 ${
layer_num});do
# 定制打印梯形左侧的空格效果
for m in $(seq $[${
layer_num}-$i]);do
echo -n " "
done
# 定制打印梯形核心部分
for j in $(seq $[$print_num]);do
echo -n "*"
done
let print_num+=2
echo
done;;
*)
echo -e "\e[31m\t请输入正确的绘图类型id\e[0m";;
esac
脚本执行效果
[root@localhost ~]# /bin/bash drawn_graph.sh
---------------查看可以绘制的图形---------------
1: 三角形 2: 梯形
-------------------------------------------
> 请输入要查看的资源信息类型: 1
> 请输入三角形绘制的层数: 5
*
* *
* * *
* * * *
* * * * *
[root@localhost ~]# /bin/bash drawn_graph.sh
---------------查看可以绘制的图形---------------
1: 三角形 2: 梯形
-------------------------------------------
> 请输入要查看的资源信息类型: 2
> 请输入梯形绘制的层数: 5
*****
*******
*********
***********
**********