Bash中计算文本文件内指定数组的大小 不存在则返回-1
问题描述
现有一个文本文件,文件中有时(并非始终)会包含一个名称唯一的数组,单行格式示例如下:
unique_array=(1,2,3,4,5,6)
需求为:当该数组存在时,获取数组的大小(例如上述示例中数组大小为6);若数组不存在,则跳过处理或返回-1。
目前使用grep命令仅能判断数组是否存在,无法实现数组大小的统计。需要注意数组支持两类特殊书写格式:
- 数组可跨多行书写,示例如下:
unique_array=(1,2,3, 4,5,6, 7,8,9,10)
- 数组元素可包含负数值,示例如下:
unique_array=(1,2,-3, 4,5,6, 7,8,-9,10)
实现方案
直接用以下shell逻辑即可兼容所有场景,无需额外依赖:
#!/bin/bash # 替换为实际要处理的文件路径 file_path="test.txt" # 跨行提取数组完整内容:从unique_array=(起始位置开始读取,直到遇到闭合的)停止 array_block=$(awk '/unique_array=/{match_start=1; sub(/^.*unique_array=\(/, "(")} match_start{print; if(/\)/) exit}' "$file_path") if [ -z "$array_block" ]; then # 未找到目标数组,返回-1 echo -1 else # 清理括号、所有空白字符(空格、制表、换行),按逗号拆分后统计有效元素个数 element_count=$(echo "$array_block" | tr -d '[:space:]()' | tr ',' '\n' | grep -v '^$' | wc -l) echo $element_count fi
逻辑说明
- 用
awk标记位模式解决跨行匹配问题,不会误读数组定义外的其他文件内容 - 统计阶段先过滤所有无效符号,再按逗号拆分元素,自动兼容负数格式、元素前后多余空格、末尾多余逗号的边缘场景
- 未匹配到数组定义时直接返回-1,符合需求
内容的提问来源于stack exchange,提问作者user2175783
相关产品推荐
相关产品推荐

