在 bash 中的文件中查找项目的出现

Look for ocurrences of items in files in bash

我有一个 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 "%s\n" "$var_with_items")

我面临的问题是它只检查变量的第一行(第一项),我不知道问题出在哪里,因为它没有抛出任何错误。但是,如果我注释 uses=$(grep -r "/some/path" -e "${pattern}" | wc -l) 行,它会正确打印 $var_with_items 中的每一行,所以我猜问题出在该行,但如果我手动执行它(使用适当的项目替换)它会起作用。

更新: 在我原来的问题中,我没有在脚本的顶部添加 set -e ,这使得它在命令以非零状态退出时立即退出。话虽这么说,因为 grep 在检测到匹配项时以 0 退出,否则 1 ,它使脚本在处理第一个没有匹配项的项目后立即退出。

grep 命令带有选项 -o returns 一行中每个匹配的模式。

因此建议:

  grep -r -o "/some/path" -e "${pattern}" | wc -l

或者:

  uses=$(grep -r -o "/some/path" -e "${pattern}" | wc -l)
 

在我原来的问题中,我没有在脚本的顶部添加 set -e,这使得它在命令以 non-zero 状态退出时立即退出。话虽这么说,因为 grep 在检测到匹配项时以 0 退出,否则 1 ,它使脚本在处理第一个没有匹配项的项目后立即退出。