You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash字符串拼接出现多余空格的问题如何排查

问题原因分析

你的脚本核心存在两个问题:

  • 调用jsonValue函数时未传入第二个参数num,导致sed语句行为异常
    你定义的jsonValue需要两个入参,第一个是待提取的键名,第二个是匹配结果的行号。但实际调用时你只传了键名,$2为空值,sed -n ${num}p会被解析为sed -n p,作用是输出所有匹配到的行,而非指定行。当匹配规则命中多个结果时,返回的多行结果在赋值给Shell变量时,换行符会被默认转为空格,就会出现多个值用空格拼接的情况。
  • awk正则拼接逻辑错误,导致意外匹配多余结果
    你在awk脚本中直接拼接Shell变量$key的方式存在转义风险,且把表示双引号的\042写在了awk的单引号作用域之外,Shell会对反斜杠做转义处理,实际传给awk的正则规则和你预期的键名+"完全不符,过于宽松的匹配规则命中了多个字段,输出了多行结果。
修复方案

可以按以下逻辑修改jsonValue函数:

  1. 用-v参数把Shell变量传入awk,避免直接拼接脚本导致的转义问题
  2. 给num参数设置默认值为1,不传参时默认取第一个匹配结果
  3. 优化匹配规则,同时清理字段前后的多余空格和引号

修改后的参考代码:

function jsonValue() {
    local key=$1
    local num=${2:-1}
    awk -F"[,:}]" -v key="$key" '{
        for(i=1;i<=NF;i++){
            if($i ~ "\"" key "\""){
                val = $(i+1)
                gsub(/^[ "]+|[ "]+$/, "", val)
                print val
            }
        }
    }' | sed -n "${num}p"
}

另外调用echo输出json变量时建议给变量加双引号,避免Shell自动拆分字段:

id=$(echo "$json" | jsonValue _id)
title=$(echo "$json" | jsonValue title)

小提示:生产环境更推荐用专门的JSON解析工具jq,提取字段只需要echo "$json" | jq -r '._id'即可,稳定性远高于自行实现的解析逻辑。

内容的提问来源于stack exchange,提问作者Döme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:36:04