bash 腳本中 grep -q 的奇怪行為

bash 腳本中 grep -q 的奇怪行為

我正在嘗試編寫一個小型 bash 腳本,該腳本將檢查數字序列的每個元素是否在給定檔案中,並列印不在的元素。

find_missing.sh:

#!/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 -

相關內容