我正在尝试编写一个小型 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.txt
为grep "$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 -