我正在尝试使用以下简化代码检查数组中的项目是否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 语句中的布尔值没有正确的语法。所以我的问题是双重的:
- 如何使用 grep 或其他命令来检查数组中的元素是否在 中
$file
? - 如何防止此命令将布尔值解释为参数,而不是将其保留为 if 语句的一部分?
答案1
- 引用所有变量扩展,包括
$file
. - 您不应该检查“布尔值”。在shell中,没有这样的东西。您的意思是检查 grep 的退出代码,如果没有行匹配则为 1,如果匹配了行则为 0(您可以在 中找到它
man grep
)。 - 检查 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