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

[特殊字符]Bash 高效神器:mapfile 命令详解,一行读取文件到数组

1. 命令简介

mapfile(别名为 readarray)是 Bash shell 的内建命令。它的核心功能是从标准输入或指定的文件描述符中逐行读取数据,并将每一行内容赋值给一个数组元素。 这是将文本数据流高效转换为结构化数组的理想工具,特别适用于需要按行处理文件或命令输出的场景。

2. 语法格式

bash

运行

mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]

3. 常用选项及说明

表格

选项参数说明
-ddelim指定行分隔符,默认是换行符(\n)。
-ncount最多读取 count 行。如果 count 为 0,则读取所有行。
-Oorigin从数组下标 origin 处开始赋值,默认为 0。
-scount跳过输入的前 count 行,不予读取。
-t移除每行末尾的分隔符(例如默认的换行符)。
-ufd从文件描述符 fd 读取数据,而非标准输入。
-Ccallback每读取 quantum 行后,执行一次 callback 语句。
-cquantum与 -C 联用,指定触发回调的行数间隔,默认为 5000。
参数说明

array(可选):目标数组的名称。如果省略,则默认使用 MAPFILE 数组。

返回值
  • 成功:返回 0。
  • 失败:返回非零值(例如使用了非法选项、目标数组为只读或非下标数组)。

4. 示例用法

4.1 基本读取

bash

运行

# 从文件读取到默认数组 MAPFILE mapfile < file.txt # 从管道读取到自定义数组 cat file.txt | mapfile myarray # 从文件描述符 3 读取(需提前打开) exec 3< file.txt mapfile -u 3 myarray exec 3<&-
4.2 控制读取范围

bash

运行

# 只读取文件的前 10 行 mapfile -n 10 < file.txt myarray # 跳过文件的前 5 行 mapfile -s 5 < file.txt myarray # 从数组下标 2 的位置开始赋值(不清空数组原有内容) mapfile -O 2 < file.txt myarray
4.3 自定义分隔符与修剪

bash

运行

# 使用 Tab 字符作为分隔符 mapfile -d $'\t' < data.tsv myarray # 移除行尾的换行符(使数组元素更“干净”) mapfile -t < file.txt myarray
4.4 使用回调函数

bash

运行

# 每读取 3 行,输出一次进度信息 mapfile -C "echo 'Processed lines up to index:'" -c 3 < file.txt myarray # 回调函数接收两个参数:下一个要赋值的下标、当前读取的行内容 mapfile -C "echo 'Index \$1, line content:'" -c 2 < file.txt myarray
4.5 数组的遍历与使用

bash

运行

# 读取文件到数组,并移除换行符 mapfile -t < file.txt lines # 遍历数组(按索引) for i in "${!lines[@]}"; do echo "$i: ${lines[$i]}" done

5. 注意事项

  • 内建命令:mapfile 是 Bash 内建命令。查看完整帮助请使用help mapfilehelp readarray
  • 数组清空行为:默认情况下,mapfile 会清空目标数组,除非使用了 -O 选项并指定了起始位置。
  • 分隔符处理:使用 -d 指定的分隔符本身不会包含在数组元素中。-t 选项用于进一步移除这个分隔符。
  • 性能考虑:处理超大文件时,可结合 -C 和 -c 选项进行分批处理,以监控进度或控制内存。回调函数应尽量高效。
  • 错误处理:确保目标数组可写,使用 -u 选项时文件描述符必须已正确打开。
  • 兼容性:该命令在 Bash 4.0 及以上版本中可用。编写可移植脚本时,应考虑备选方案。

兼容性备选方案

使用 while read 循环可以实现类似功能,兼容性更广:

bash

运行

myarray=() while IFS= read -r line; do myarray+=("$line") done < file.txt
http://www.jsqmd.com/news/1158549/

相关文章:

  • 2026年7月最新重庆江津区几江街道亨得利官方名表服务中心电话公示 - 亨得利钟表维修中心
  • NTP v4 协议实战:C语言实现3步获取网络时间,误差<100ms(附完整代码)
  • Unity网格优化实战:MeshFusion Pro核心原理与性能提升指南
  • 2026年7月矿山螺栓/石油螺栓工厂推荐盘点_芜湖皖拓机械科技有限公司 - 行业平台推荐
  • MP2315GJ-Z AAM模式解析:轻载效率提升15%的电阻配置与实测对比
  • 直流有刷电机驱动器设计与STM32F745控制实现
  • NapMem:将长期记忆重构为可导航动作空间的智能体决策框架
  • 反对称矩阵 2
  • Spring Boot 2.7 + Logback 多环境配置:3套Profile与动态日志级别切换
  • 2026年7月网带输送设备/上海皮带输送设备厂家推荐参考_上海伽姆机械设备有限公司 - 品牌宣传支持者
  • 2026年7月柔性接口球墨铸铁管/小口径球墨铸铁管生产商推荐合集_甘肃中源瑞峰管业有限公司 - 行业平台推荐
  • STM32F427ZI与TB6593FNG电机驱动方案详解
  • 2026主流驱动工具企业资质及信任背书实力对比
  • 如何用BackgroundRemover实现专业级背景移除?免费AI工具终极指南
  • 史上最详细VS编译器scanf报错问题及如何一劳永逸,草履虫也能听懂
  • Flux1-dev:如何在24GB以下显存上运行专业级AI模型?低显存用户必读指南
  • 美国FDA官员突击上门验厂!没发邮件、没打招呼,工厂该如何应对?
  • 130页智能体综述:常驻智能体定义与系统化评估框架解析
  • 大模型产品化:从Demo到商业闭环的必经之路
  • Claude Code生产级落地:三层隔离架构与CI/CD工程化实践
  • AI芯片与智能驾驶技术解析:从推理优化到数据平滑处理
  • 服务原子化:大模型时代API开放的真正范式升级
  • 靶向matCAF药物筛选实战:基于分子对接虚拟筛选PCC1及体内验证实验设计
  • 金蝶云星空 V8.0 报表插件二次开发:物料收发汇总表 7 大核心方法解析与实战
  • 2026年7月风机/风机配套防火阀风口风管公司推荐榜单_陕西锐博优通风设备有限公司 - 品牌宣传支持者
  • 专用推理机硬件设计:TPU/ASIC架构与KV Cache优化实践
  • CBCX平台的资金流程说明靠谱吗?
  • M365 Copilot数据安全管控:四层授权模式深度解析
  • JetPack 6.2.2下Isaac ROS可信启动与Docker深度修复指南
  • 端侧大模型部署实战:Pulsar2 NPU上Grounding DINO的混合精度量化