Linux
帶有 grep 的 if 語句
我想要做的是獲取使用者輸入並蒐索文件,如果匹配它將顯示結果,否則它將回顯 $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
來判斷是否可以在文件中找到模式。如果找到該模式,將列印匹配的行(無需再做任何事情)。關於
printf
in place of的使用echo
:為什麼 printf 比 echo 好?更短,使用短路或。
read -r -p 'Enter pattern: ' grep -e "$REPLY" records || printf 'No match found for pattern "%s"\n' "$REPLY"