当前位置: 首页 > ai >正文

Shell脚本-嵌套循环应用案例

在Shell脚本编程中,嵌套循环是一种强大的工具,可以用于处理复杂的任务和数据结构。通过在一个循环内部再嵌套另一个循环,我们可以实现对多维数组、矩阵操作、文件处理等多种高级功能。本文将通过几个实际的应用案例来展示如何使用嵌套循环解决具体的编程问题。

案例一:打印乘法表

一个常见的应用是打印乘法表。通过嵌套循环,我们可以轻松地生成并打印出指定范围内的乘法表。

脚本示例:

#!/bin/bashfor ((i=1; i<=9; i++)); dofor ((j=1; j<=i; j++)); doprintf "%d*%d=%-4d" $j $i $((i*j))doneecho ""
done

说明:

  • 外层循环控制行数(即乘数),内层循环控制列数(即被乘数)。
  • printf函数用于格式化输出,使得每一项占据相同宽度,从而保持表格整齐。

案例二:遍历目录树

假设我们需要编写一个脚本来递归遍历目录及其子目录,并列出每个目录下的所有文件。

脚本示例:

#!/bin/bashtraverse_directory() {local directory=$1  # 获取传入的目录路径for file in "$directory"/*; doif [ -d "$file" ]; thenecho "Directory: $file"traverse_directory "$file"  # 递归调用自身以遍历子目录elif [ -f "$file" ]; thenecho "File: $file"fidone
}root_directory="/path/to/start/directory"
traverse_directory "$root_directory"

说明:

  • 使用递归函数traverse_directory来遍历目录树。
  • 对于每个项目,首先检查它是目录还是文件,然后根据类型采取相应的行动。

案例三:矩阵转置

给定一个二维数组(矩阵),我们可以使用嵌套循环将其转置(即将行变为列,列变为行)。

脚本示例:

#!/bin/bashmatrix=("1 2 3""4 5 6""7 8 9"
)rows=${#matrix[@]}
cols=$(echo "${matrix[0]}" | wc -w)echo "Original Matrix:"
for ((i=0; i<rows; i++)); doecho "${matrix[$i]}"
doneecho ""echo "Transposed Matrix:"
for ((j=0; j<cols; j++)); dorow=""for ((i=0; i<rows; i++)); dovalue=$(echo "${matrix[$i]}" | cut -d' ' -f$((j+1)))row="$row $value"doneecho "$row"
done

说明:

  • 首先确定矩阵的行列数。
  • 外层循环遍历每一列,内层循环遍历每一行,构建转置后的矩阵。

案例四:批量处理文件

假设我们需要对某个目录下的所有.txt文件进行批量处理,比如为每个文件添加前缀或后缀。

脚本示例:

#!/bin/bashprefix="backup_"directory="/path/to/txt/files"
cd "$directory" || exitfor file in *.txt; doif [ -f "$file" ]; thennew_name="${prefix}${file}"mv "$file" "$new_name"echo "Renamed '$file' to '$new_name'"# 进一步处理新命名的文件for operation in "operation1" "operation2"; docase $operation in"operation1")echo "Performing operation1 on $new_name";;"operation2")echo "Performing operation2 on $new_name";;esacdonefi
done

说明:

  • 外层循环遍历当前目录下的所有.txt文件,并重命名它们。
  • 内层循环对每个重命名后的文件执行一系列预定义的操作。

结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

http://www.xdnf.cn/news/2662.html

相关文章:

  • vue mixin混入与hook
  • 如何使用可视化工具分析 JVM 的性能瓶颈?
  • Spring Security授权管理
  • 综合练习一
  • JAVA基础:Collections 工具类实战指南-从排序到线程安全
  • ViTa-Zero:零样本视觉触觉目标 6D 姿态估计
  • Ubuntu深度学习革命:NVIDIA-Docker终极指南与创新实践
  • LLVIP、KAIST、M3FD数据集
  • GD32F407单片机开发入门(十六)单片机IAP(在应用编程)详解及实战源码
  • 消息队列优化指南:处理堆积与保障消息可靠性
  • 喜马拉雅卖身腾讯音乐:在线音频独立时代的终结
  • Molex莫仕连接器:增强高级驾驶辅助系统,打造更安全的汽车
  • codeforces C. The Trail
  • 【Nginx】 使用least_conn负载均衡算法是否能将客户端的长连接分散到不同的服务器上demo
  • 【AI生产力工具】Windsurf,一款AI编程工具
  • 华纳云:centos如何实现JSP页面的动态加载
  • 模板方法模式(Template Method Pattern)
  • 数据库对象概述
  • Java项目与技术栈场景题深度解析
  • C语言(5)—操作符详解
  • leetcode 143. 重排链表
  • js day8
  • Java学习手册: IoC 容器与依赖注入
  • leetcode刷题日记——两数相加
  • 【Redis】基础4:作为分布式锁
  • 搭建speak yarn集群:从零开始的详细指南
  • 关于健身房管理系统前后端软件开发主要功能需求分析
  • 深入理解网络原理:TCP协议详解
  • MCP Servers玩玩WebUI自动化
  • 如何在idea 中写spark程序