如何让While Loop Read与JQ复用COLUMNS数组避免重复列名
复用COLUMNS数组简化Shell脚本中的read与jq操作
核心思路
通过将COLUMNS数组分别转换成jq可识别的字段表达式和read的变量列表,彻底避免重复书写列名,实现一处定义多处复用。
示例代码
假设你原本的代码重复写了列名,修改后的完整实现如下:
# 统一定义需要处理的列名数组 COLUMNS=("id" "name" "email" "phone_number") # 生成jq所需的字段提取表达式:处理为 .id,.name,.email,.phone_number 格式 JQ_FIELDS=$(printf '.%s,' "${COLUMNS[@]}" | sed 's/,$//') # 若列名包含空格/特殊字符,改用带引号的jq语法:."id",."user name" # JQ_FIELDS=$(printf '."%s",' "${COLUMNS[@]}" | sed 's/,$//') # 处理JSON数据并循环读取结果 cat your_data.json | jq -r "$JQ_FIELDS | @tsv" | while IFS=$'\t' read -r "${COLUMNS[@]}"; do # 直接使用数组中定义的变量名,无需重复声明 echo "ID: $id | 姓名: $name | 邮箱: $email | 电话: $phone_number" done
关键细节说明
jq字段表达式生成:
printf '.%s,' "${COLUMNS[@]}"给每个列名前缀加.,后缀加逗号,得到类似.id,.name,.email,的临时字符串sed 's/,$//'移除末尾多余的逗号,生成jq可直接使用的字段列表
read变量复用:
read -r "${COLUMNS[@]}"直接将数组元素作为read的变量名列表,TSV格式的每行数据会按顺序赋值给对应变量IFS=$'\t'强制指定制表符为分隔符,避免列值包含空格时出现拆分错误
特殊列名兼容:
如果列名包含空格、.等特殊字符,将printf的格式串改为'."%s",',生成带双引号的jq字段引用(如."user name"),确保jq能正确识别。
内容的提问来源于stack exchange,提问作者theprof86
相关产品推荐
相关产品推荐

