在文件中搜索数组中的字符串

在文件中搜索数组中的字符串

我正在尝试使用以下简化代码检查数组中的项目是否options在文件中:$file

options=(
    A
    B
    C
)

for i in "${options[@]}"; do
    if grep -F $file "${i}" = false; then
        echo "${i}"
    fi
done

我希望这会输出 A、B 或 C(如果它们不存在于 中)$file,但它会输出 A、B 和 C:

grep: A: No such file or directory
grep: =: No such file or directory
grep: false: No such file or directory

由此看来,grep 似乎将所有参数解释为要检查或检查的文件,这也意味着 if 语句中的布尔值没有正确的语法。所以我的问题是双重的:

  1. 如何使用 grep 或其他命令来检查数组中的元素是否在 中$file
  2. 如何防止此命令将布尔值解释为参数,而不是将其保留为 if 语句的一部分?

答案1

  1. 引用所有变量扩展,包括$file.
  2. 您不应该检查“布尔值”。在shell中,没有这样的东西。您的意思是检查 grep 的退出代码,如果没有行匹配则为 1,如果匹配了行则为 0(您可以在 中找到它man grep)。
  3. 检查 grep 参数的顺序。首先是模式,然后是文件名。

这将回显数组中options不在文件中的所有元素:

options=(
    A
    B
    C
)

for i in "${options[@]}"; do
    if ! grep -qF "$i" "$file"; then
        echo "$i"
    fi
done

-q向 grep 添加了标志,它会抑制 grep 匹配的行,否则将被发送到标准输出。

答案2

Usage: grep [OPTION]... PATTERN [FILE]...                                                                                                                          
Search for PATTERN in each FILE.                                                                                                                                   
Example: grep -i 'hello world' menu.h main.c   

-q, --quiet, --silent     suppress all normal output

options=(
    A
    B
    C
)

for i in "${options[@]}"; do
    if grep -q "${i}" $file; then
        echo "${i}" # ${i##*/} is a parametr expansion 
                    #it removes left side of string till last slash
    fi
done

相关内容