Linux

帶有 grep 的 if 語句

  • June 12, 2021

我想要做的是獲取使用者輸入並蒐索文件,如果匹配它將顯示結果,否則它將回顯 $keyword not found。

但是我的腳本總是返回錯誤。

      read -p "Enter keyword: " keyword
      if search="$(cat ./records | grep '$keyword')"
      then
      echo "$search"
      else
       echo "$keyword not found!"
      fi ;;
read -r -p 'Enter pattern: ' pattern

result=$( grep -e "$pattern" records )

if [ -n "$result" ]; then
   printf '%s\n' "$result"
else
   printf 'No match found for pattern "%s"\n' "$pattern"
fi
  • search對(在我的程式碼中)的賦值result最好在if語句之外完成。
  • -n(“is this string non-empty?”) 對結果進行測試。
  • 不要單引號變數(它會阻止 shell 擴展它的值)。改為雙引號。
  • 注意“模式”而不是“關鍵字”。您在此處使用的方式grep將使用使用者提供的字元串作為正則表達式(一種模式,例如cat.*dog),不一定作為普通的固定字元串。
  • cat應該用於連接文件,在大多數其他情況下,它或多或少是無用的。
  • 用於read -r允許使用者輸入反斜杠。

或者:

read -r -p 'Enter pattern: ' pattern

if ! grep -e "$pattern" records; then
   printf 'No match found for pattern "%s"\n' "$pattern"
fi

這避免了在 shell 變數中儲存潛在的大量數據,而是依靠退出狀態grep來判斷是否可以在文件中找到模式。如果找到該模式,將列印匹配的行(無需再做任何事情)。

關於printfin place of的使用echo為什麼 printf 比 echo 好?


更短,使用短路或。

read -r -p 'Enter pattern: '

grep -e "$REPLY" records ||
printf 'No match found for pattern "%s"\n' "$REPLY"

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