我想做的是获取用户输入并搜索文件,如果匹配,它将显示结果,否则它将回显 $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
- 不要使用引号,
$()
如上面提到的@jasonwryan - 没有必要使用
cat
管道grep
。改用grep <pattern> file
;;
之后删除fi