Как правильно передать строку $ с пробелами в grep - PullRequest
1 голос
/ 14 апреля 2019

Я пытался создать 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

любые предложения высоко ценятся

Ответы [ 2 ]

3 голосов
/ 14 апреля 2019

Если вы просто назначите 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
0 голосов
/ 14 апреля 2019

попробуй

cat /usr/share/applications/*.desktop | grep -i Mail\ Reader
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...