if 语句与 grep

if 语句与 grep

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

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

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

答案1

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(“这个字符串非空吗?”) 对结果进行测试。

  • 不要用单引号引用该变量(这会阻止 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代替echo为什么 printf 比 echo 更好?


更短,使用短路 OR。

read -r -p 'Enter pattern: '

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

答案2

见下文:

read -p "Enter keyword: " keyword

if search=$(grep "$keyword" ./records)
        then
                echo "$search"
        else
                echo "$keyword not found!"
        fi
  1. 不要使用引号,$()如上面提到的@jasonwryan
  2. 没有必要使用cat管道grep。改用grep <pattern> file
  3. ;;之后删除fi

相关内容