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
相关产品推荐
相关产品推荐

