我正在嘗試編寫一個小型 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.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 -