GitHub Actions中Shell脚本获取git diff输出赋值及循环匹配问题
问题修复方案
问题1:files变量为空修复
Shell 变量赋值语法要求等号两侧不能有空格,且需要用$()包裹命令才能捕获命令输出到变量。原写法中等号后有空格,也没有用命令替换,导致变量没有存储到git命令的输出。
修复后的赋值代码:
files=$(git diff --name-only --cached)
问题2:后缀匹配逻辑修复
原匹配逻辑存在两处错误:
- 普通
[]判断不支持通配符匹配,且"*.cls"被引号包裹后会被识别为普通字符串,永远无法匹配真实文件名 - 两个独立
if判断逻辑冲突:当文件是.cls后缀时,第一个if命中后,第二个if会判断不命中,触发else分支输出错误的not found提示
修复后的循环逻辑可直接使用支持通配符的[[]]判断,搭配if...elif...else分支结构:
for file in $files; do if [[ "$file" == *.cls ]]; then echo "$file Class Updated" elif [[ "$file" == *.flow ]]; then echo "$file Flow Updated" else echo "$file 未匹配到已知文件类型" fi done
完整修复后代码
echo "Git Add --all" git add --all echo "Add to Files:" files=$(git diff --name-only --cached) echo "*************************************************************" echo "GIT diff:" echo "" git diff --name-only --cached echo "" echo "*************************************************************" echo "Files:" echo $files for file in $files; do if [[ "$file" == *.cls ]]; then echo "$file Class Updated" elif [[ "$file" == *.flow ]]; then echo "$file Flow Updated" else echo "$file 未匹配到已知文件类型" fi done
扩展优化(可选)
如果你的文件路径可能包含空格,建议使用数组存储文件列表,避免遍历出错:
# 数组方式存储文件名,兼容带空格的路径 readarray -t files < <(git diff --name-only --cached) # 遍历数组 for file in "${files[@]}"; do # 后续判断逻辑不变 done
内容的提问来源于stack exchange,提问作者Matt Holdgate
相关产品推荐
相关产品推荐

