if 语句与 grep

Pri*_*kul 2 linux scripting bash shell-script

我想做的是获取用户输入并搜索文件,如果匹配,它将显示结果,否则它将回显 $keyword not found。

但我的票据总是返回错误。

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

Kus*_*nda 5

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
Run Code Online (Sandbox Code Playgroud)
  • search对(在我的代码中)的赋值result最好在if语句之外完成。

  • 使用-n(“这个字符串非空吗?”) 对结果进行测试。

  • 不要用单引号引用该变量(这会阻止 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
Run Code Online (Sandbox Code Playgroud)

这避免了在 shell 变量中存储潜在的大量数据,而是依赖退出状态来grep判断是否可以在文件中找到该模式。如果找到该模式,则将打印匹配的行(无需执行任何其他操作)。

关于使用 代替printfecho为什么printf 比 echo 更好?


更短,使用短路 OR。

read -r -p 'Enter pattern: '

grep -e "$REPLY" records ||
printf 'No match found for pattern "%s"\n' "$REPLY"
Run Code Online (Sandbox Code Playgroud)