如何用Bash脚本检查文本文件中的链接是否存在于项目文件夹中
问题原因及解决方案
主要问题点
- read命令默认转义反斜杠:你没有给read加
-r参数,行尾的反斜杠会被识别为续行符,会把多行内容拼接成一行读取,同时会丢弃反斜杠本身,导致读取到的链接内容完全错误。 - deeplinks.txt行尾存在多余字符:所有链接行末尾都带有反斜杠和空格,这些多余字符会被带入搜索参数,和代码中实际存在的干净链接无法匹配。
- grep默认解析正则表达式:你的链接中存在
[]这类正则特殊字符,grep会把[MPCUID of a Mobile option]解析为字符集匹配规则,而不是按字面内容匹配,导致匹配失败。
修复方案
首先先整理deeplinks.txt文件:把每个链接单独放一行,删除所有行尾的反斜杠和多余空格,整理后内容示例如下:
myproximus://dashboard myproximus://products myproximus://products/MV myproximus://products/MV/ordering/[MPCUID of a Mobile option] myproximus://products/MV/settings myproximus://products/TV myproximus://products/TV/ordering/[MPCUID of a TV option] myproximus://products/TV/settings myproximus://products/FI myproximus://products/FI/settings myproximus://products/EP myproximus://payments myproximus://rewards
然后修改脚本如下:
#!/bin/bash echo "Hi this is a test" file='deeplinks.txt' # 给read加-r参数禁止反斜杠转义 while IFS= read -r line; do # 清理行尾的空白、反斜杠等多余字符 clean_line=$(echo "$line" | sed 's/[\\[:space:]]*$//') # 跳过空行 [ -z "$clean_line" ] && continue # grep加-F按固定字符串匹配,-q静默输出只判断状态 grep -srqF "$clean_line" /Users/id856795/myproximus-rn/src 2>/dev/null || echo "$clean_line" done < "$file"
修改说明
IFS= read -r line:IFS置空防止行首行尾的空白被自动截断,-r禁止反斜杠转义,完整读取每一行原始内容sed 's/[\\[:space:]]*$//':自动清理行尾的反斜杠、空格、制表符等多余字符,即使deeplinks.txt没整理干净也能正常处理grep参数-F:固定字符串匹配,不会解析链接中的正则特殊字符,-q不需要输出匹配内容,只返回匹配状态,运行效率更高
内容的提问来源于stack exchange,提问作者Dipika Mishra
相关产品推荐
相关产品推荐

