2.4.4 嵌套循环
学习目标
这一节,我们从 基础知识、简单实践、小结 三个方面来学习。
基础知识
简介
这里的嵌套实践,与选择语句的嵌套实践基本一致,只不过组合的方式发生了一些变化。常见的组合样式如下:
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
小结