我有一个bash脚本如下。它基本上是将文本文件中的内容加载到一个变量中,然后从该变量中读取每行,并尝试在某个文件夹下的文件中查找包含该项的模式的匹配项,最后生成一个包含匹配项的列表。
#!/usr/bin/env bash
set -e
var_with_items=$(<"/path/to/file")
matches=""
while IFS= read -r item; do
echo "- ${item}"
pattern="foo/bar/${item}/"
uses=$(grep -r "/some/path" -e "${pattern}" | wc -l)
if [[ "${uses}" != "0" ]]; then
matches+="${item}n";
fi
done < <(printf "%sn" "$var_with_items")
我面临的问题是它只检查变量的第一行(第一项),我不知道问题是什么,因为它没有抛出任何错误。然而,如果我注释uses=$(grep -r "/some/path" -e "${pattern}" | wc -l)
行,它正确地打印$var_with_items
中的每一行,所以我猜问题在那一行,但是如果我手动执行它(使用适当的项目替换),它就可以工作了。
更新:在我最初的问题中,我没有在脚本的顶部添加set -e
,这使得它在命令以非零状态退出时立即退出。也就是说,当检测到匹配时,grep
与0
一起退出,而1
则不然,它使脚本在处理第一个没有匹配的项目时立即退出。
带选项-o
的grep
命令返回一行中所有匹配的模式。
因此建议:
grep -r -o "/some/path" -e "${pattern}" | wc -l
或:
uses=$(grep -r -o "/some/path" -e "${pattern}" | wc -l)
在我最初的问题中,我没有在脚本的顶部添加set -e
,这使得它在命令以非零状态退出时立即退出。也就是说,当检测到匹配时,grep
与0
一起退出,而1
则不然,它使脚本在处理第一个没有匹配的项目时立即退出。