Если предположить, что вы хотите, чтобы соответствовать значение переменной буквально с помощью grep
: используйте -F
вариант, который выполняет буквального поиска подстроки (а не интерпретировать строку поиска как регулярное выражение , который grep
делает по умолчанию):
package='br.com.example.pc1.test'
search=$(adb shell pm list packages | grep -F "$package")
Обратите внимание, что это будет выполнять подстроки поиска на каждой строке.
Если ваша цель состоит в соответствие 'br.com.example.pc1.test'
точно (то есть, только если вся строка матчей), добавьте -x
:
package='br.com.example.pc1.test'
search=$(adb shell pm list packages | grep -Fx "$package")
Если ваша цель заключается в соответствии подстроки, которые начинают с br.com.example.pc1.test
, но содержат дополнительные компоненты, просто добавьте .
в строку поиска:
package='br.com.example.pc1.test'
search=$(adb shell pm list packages | grep -F "$package.")
Однако, что будет по-прежнему соответствовать линии с символами перед темbr.com.example.pc1.test
.
Чтобы убедиться, что строка поиска соответствует только начало строки, вам необходимо регулярное выражение с якоря ^
:
package='br.com.example.pc1.test'
search=$(adb shell pm list packages | grep "^${package//./\\.}\.")
Обратите внимание, как Bash расширения параметр ${package//./\\.}
используется, чтобы избежать символы .
. в переменном значении как \.
, чтобы гарантировать, что grep
рассматривает их как literal.
символы в контексте регулярного выражения.
Не могли бы вы еще немного объяснить, в чем проблема? Вы сопоставляете результаты, которые вы не хотите сопоставлять? – NickLamp
Также обратите внимание, что переменная оболочки _assignments_ должна _not_ быть '$' -prefixed; вы используете переменные '$' to _reference_. – mklement0