Shell脚本实现:检查文件数组并将元素添加至数组内
解决Shell脚本向指定数组首行添加元素的问题
问题描述
需要编写Shell脚本实现以下逻辑:
- 检查文件
a.txt中是否存在fs.m数组定义 - 若不存在:创建该数组并添加元素
xyz - 若存在:将
xyz添加至数组内部的首行(即数组起始行的下一行)
当前使用的脚本会将xyz追加到文件末尾,无法满足需求。
原文件示例
fs.m = [ abc, ]
期望结果
fs.m = [ xyz, abc, ]
错误脚本代码
#!/bin/bash if grep -A1 -qE '^fs.m *= *\[' a.txt; then echo -e "xyz," >> a.txt else echo -e 'fs.m = [' >> a.txt echo -e "xyz," >> a.txt echo -e "]" >> a.txt fi
错误执行结果
fs.m = [ abc, ] xyz
解决方案
使用sed命令定位数组起始行并插入内容,替代直接追加到文件末尾的逻辑。修改后的脚本如下:
#!/bin/bash # 检查fs.m数组定义是否存在 if grep -qE '^fs.m *= *\[' a.txt; then # 在数组起始行的下一行插入xyz, # 注意:macOS(BSD sed)需改为 sed -i '' '/^fs.m *= *\[$/a\ xyz,' a.txt sed -i '/^fs.m *= *\[$/a\ xyz,' a.txt else # 不存在则创建完整的数组结构 cat >> a.txt <<EOF fs.m = [ xyz, ] EOF fi
代码说明
- 检测数组存在性:使用
grep -qE静默匹配fs.m = [的定义行,-q参数仅返回匹配状态,不输出内容 - 插入元素到数组首行:
sed -i实现原地修改文件- 正则
/^fs.m *= *\[$/精准匹配数组起始行(行首到行尾的fs.m = [,允许等号前后有空格) a\命令在匹配行的下一行插入指定内容xyz,
- 创建新数组:使用Here Document(
<<EOF)批量写入数组结构,比多次echo更简洁易维护
内容的提问来源于stack exchange,提问作者Jeetu
相关产品推荐
相关产品推荐

