bash 脚本中 grep -q 的奇怪行为

bash 脚本中 grep -q 的奇怪行为

我正在尝试编写一个小型 bash 脚本,它将检查数字序列的每个元素是否存在于给定的文件中,并打印不存在的元素。

查找缺失值:

#!/bin/bash
for num in {1..5}; do
    if ! [[ $(grep -q "$num" numbers.txt) ]]; then
        echo "$num"
    fi
done

数字.txt:

1
2
5

预期输出:

3
4

实际产量:

1
2
3
4
5

如果我将该行更改grep -q "$num" numbers.txtgrep "$num" numbers.txt,我会得到预期的输出。但是,我的理解是,-q如果找到数字,该标志应该返回退出代码 0,如果未找到数字,则返回退出代码 1,我不明白为什么有或没有该标志会有所不同。

如果我尝试运行 grep 命令的单个实例,我会得到我期望的行为:

grep -q "1" numbers.txt; echo "$?"
0
grep -q "3" numbers.txt; echo "$?"
1

有人能帮助我了解这里发生了什么吗?

答案1

$( ... )捕获输出,但grep -q不产生输出。不要使用它。您甚至不需要方括号,因为if可以使用退出状态:

if ! grep -q "$num" numbers.txt ; then

你可以使用以下命令获得相同的输出

printf '%s\n' {1..5} | grep -vwFf numbers.txt -

相关内容