Bash脚本Grep条件匹配异常:符合规则却进入else分支
Bash脚本条件判断失败排查方案
1. 空格匹配不严谨
package-lock.json中的行可能存在冒号后多空格的情况(比如"resolved": "https://..."),如果脚本里的匹配前缀只写了单个空格,会导致匹配失败。
- 修正方式:用正则匹配任意空白字符,比如
grep -E '"resolved":\s+"https://nexus.com/repository/myrepo',或者在Bash条件判断里用[[ "$line" =~ ^\"resolved\":\s+\"https://nexus.com/repository/myrepo ]]。
2. 隐藏字符干扰
Windows格式的换行符(\r\n)会让行尾多出\r字符,导致脚本认为行内容不符合前缀。
- 验证方法:用
cat -A filename查看行尾是否有^M(即\r)。 - 解决:用
dos2unix转换文件格式后再测试。
3. 脚本逻辑错误
如果脚本用了[ ]做条件判断,无法支持通配符或正则匹配,必须用[[ ]]结合=~来做正则匹配。
- 错误示例:
if [ "$line" == "\"resolved\": \"https://nexus.com/repository/myrepo"* ]; then # 此写法不支持通配符匹配,必然失败 fi - 正确写法:
if [[ "$line" =~ ^\"resolved\":\s+\"https://nexus.com/repository/myrepo ]]; then # 符合条件的处理逻辑 else # 打印不符合的行,方便定位问题 echo "异常行:$line" fi
4. 路径遍历遗漏文件
确认脚本是否真的遍历到了所有目标文件,比如根目录和e2e子目录下的所有package-lock.json。
- 验证命令:
find . -path "./e2e" -o -path "." -name "package-lock.json",检查输出是否包含所有需要的文件。
5. 转义或引号错误
脚本中匹配字符串的引号转义是否正确?比如在grep或条件判断里,双引号需要正确转义或用单引号包裹。
- 错误示例:
grep "\"resolved": "http"(转义错误) - 正确示例:
grep '"resolved": "http'或grep "\"resolved\": \"http"
内容的提问来源于stack exchange,提问作者cien
相关产品推荐
相关产品推荐

