如何正确地将带有空格的$ string传递给grep

问题描述 投票:1回答:2

我试图制作bash脚本,可以在* .desktop文件中找到“关键字”。我的方法是将一些关键字设置为数组,然后将其传递给grep,它可以完美地工作,直到关键字至少有两个由空格分隔的单词。

应该是什么

cat /usr/share/applications/*.desktop | grep -i "Mail Reader"

我试过的

search=$(printf 'Name=%s' "${appsx[$index]}")
echo \""$search\"" #debug
cat /usr/share/applications/*.desktop | grep -i $search
search=$(printf 'Name=%s' "${appsx[$index]}")
echo \""$search\"" #debug
cat /usr/share/applications/*.desktop | grep -i \""$search\""
search=$(printf '"Name=%s"' "${appsx[$index]}")
echo $search #debug
cat /usr/share/applications/*.desktop | grep -i $search

任何建议都非常感谢

arrays bash grep
2个回答
3
投票

如果您只是将Mail Reader分配给变量搜索,如下所示

search=Mail Reader

bash会抱怨找不到Reader命令,因为它在第一个空白字符之后需要任何后续命令。你需要的是什么

search="Mail Reader" # 'Mail Reader' would also do.

在你的命令替换的情况下,事情没有什么不同,你需要双引号包装器,因为替换本身不会发生在单引号内

search="$(command)"

在你的情况下,你使用命令替换做了一个过度杀伤。它可以简化为:

search="Name=${appsx[$index]}"
# Then do the grep.
# Note that cat-grep combo could be simplified to
# -h suppresses printing filenames to get same result as cat .. | grep
grep -ih "$search" /usr/share/applications/*.desktop

-1
投票

尝试

cat /usr/share/applications/*.desktop | grep -i Mail\ Reader
© www.soinside.com 2019 - 2024. All rights reserved.