Bash

在文件中搜尋數組中的字元串

  • June 12, 2020

我正在嘗試使用以下簡化程式碼檢查數組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 中不存在,我希望它輸出 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 語句中的布爾值沒有正確的語法。所以我的問題是雙重的:

  1. 如何使用 grep 或其他命令來檢查數組中的元素是否在$file
  2. 如何防止此命令將布爾值解釋為參數,而不是將其作為 if 語句的一部分?
  1. 引用所有變數擴展,包括$file.
  2. 您不應該檢查“布爾值”。在shell中,沒有這樣的東西。您的意思是檢查 grep 的退出程式碼,如果沒有匹配行則為 1,如果匹配行則為 0(您可以在 中找到它man grep)。
  3. 檢查 grep 參數的順序。首先是模式,然後是文件名。

這將回顯數組options中不在文件中的所有元素:

options=(
   A
   B
   C
)

for i in "${options[@]}"; do
   if ! grep -qF "$i" "$file"; then
       echo "$i"
   fi
done

我在 grep 中添加了-q標誌,它禁止 grep 匹配的行,否則將被發送到標準輸出。

引用自:https://unix.stackexchange.com/questions/592397