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

时间:2019-04-14 08:37:52

标签: arrays bash grep

我试图制作可以在* .desktop文件中找到“关键字”的bash脚本。我的方法是将一些关键字设置为数组,然后将其传递给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

任何建议都将受到赞赏

2 个答案:

答案 0 :(得分: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 :(得分:-1)

尝试

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