git branch命令CLI运行正常,shell脚本循环调用变量执行失败如何解决
问题根因
报错的核心原因是Git 1.8.3.1默认开启了彩色输出,git branch -r的返回结果中携带了不可见的ANSI颜色控制转义序列(也就是你排查到的^[[m类特殊字符)。直接echo变量时终端会自动解析转义序列,所以看起来分支名是正常的,但实际字符串中夹杂的控制字符会被Git判定为非法分支名字符,触发报错。
解决方案
方案1:从源头避免生成转义字符(优先推荐)
执行Git命令时强制关闭彩色输出,直接拿到纯文本的分支名结果,无需额外清洗:
# 提取分支名时追加 -c color.ui=never 参数禁用颜色输出 nvVar=$(git -c color.ui=never branch -r | grep -v '->' | grep -Ev 'master|spdk\-1\.6' | cut -d'/' -f2)
执行后再跑你的原有循环命令即可正常创建跟踪分支。
方案2:清洗已有变量中的转义字符
如果已经拿到了带特殊字符的变量,可以通过sed命令过滤所有ANSI颜色转义序列,不需要硬编码任何分支名:
# 清洗变量中的所有ANSI控制字符 nvVar=$(sed 's/\x1B\[[0-9;]*[a-zA-Z]//g' <<< "$nvVar")
优化建议
为了避免分支名带空格等特殊字符导致的遍历异常,建议直接用数组存储分支名:
# 直接将纯文本分支名存入数组 readarray -t nvArr < <(git -c color.ui=never branch -r | grep -v '->' | grep -Ev 'master|spdk\-1\.6' | cut -d'/' -f2) # 遍历数组创建跟踪分支 for i in "${nvArr[@]}"; do git branch --track "$i" "origin/$i" done
内容的提问来源于stack exchange,提问作者James Resoldier
相关产品推荐
相关产品推荐

