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

Windows Git Bash脚本字符串拼接失效问题求助

问题排查:Git Bash下Bash脚本读取YAML键值异常

问题根源

脚本在macOS正常但Git Bash异常,核心原因是Windows与Unix系统的换行符差异:

  • macOS使用LF(\n)作为换行符
  • Windows默认使用CRLF(\r\n)作为换行符

当yq和jq处理Git Bash环境下的输出时,返回的apps变量中每个元素末尾会带有隐藏的回车符\r。循环中$i实际是api1\r、api2\r,而非预期的api1、api2:

  • 执行echo "yq .$i.image.repository..."时,\r会让光标回到行首,.api1\r.image.repository会被覆盖显示为.image.repository - < ./values.yaml
  • yq解析.apis.$i.image.repository时,实际查找的是.apis.api1\r.image.repository,无法匹配到对应值,因此返回null
  • 最后一个api3因文件末尾无换行符,未携带\r,所以能正常执行

解决方案

方案1:清理变量中的回车符

在循环内对$i做预处理,移除末尾的\r:

function pull_apis () {
    local apps=$(yq ".apis | keys" - < ./values.yaml -o json | jq -n 'inputs[]' --raw-output)
    for i in ${apps[@]}
    do
        # 移除变量中的回车符
        i=$(echo "$i" | tr -d '\r')
        echo "$i"
        echo "yq .apis.$i.image.repository - < ./values.yaml"        
        repository=$(yq ".apis.$i.image.repository" - < ./values.yaml)
        echo "----  $repository"
    done
}

pull_apis

方案2:强制Git Bash使用Unix风格换行符

在脚本开头添加环境配置,强制命令输出使用LF:

# 脚本开头添加,忽略回车符影响
export SHELLOPTS
set -o igncr

function pull_apis () {
    local apps=$(yq ".apis | keys" - < ./values.yaml -o json | jq -n 'inputs[]' --raw-output)
    for i in ${apps[@]}
    do
        echo "$i"
        echo "yq .apis.$i.image.repository - < ./values.yaml"        
        repository=$(yq ".apis.$i.image.repository" - < ./values.yaml)
        echo "----  $repository"
    done
}

pull_apis

方案3:优化yq调用逻辑(更可靠)

直接用yq一次性处理所有键值对,彻底规避变量传递的换行符问题:

function pull_apis () {
    yq ".apis | to_entries[] | \"\(.key)\nyq .apis.\(.key).image.repository - < ./values.yaml\n----  \(.value.image.repository)\"" ./values.yaml
}

pull_apis

验证方法

可在循环内添加echo "$i" | od -c查看变量实际内容,若输出中出现api1\r,即可确认是回车符导致的问题。

内容的提问来源于stack exchange,提问作者Ajay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 07:54:20