Если вы хотите обрабатывать каждый аргумент командной строки как отдельный шаблон (т. Е. Вам нужно «совпадение», если строка начинается с любого аргументов командной строки), то вы можете построить всю расширенную регулярную единицуВыражение наподобие этого:
^(arg1|arg2|arg3|...) [0-9]+
Вы можете использовать IFS равным |
и $*
для автоматического расширения ваших позиционных параметров в эту форму, например:
(IFS=\|; echo "^($*) [0-9]+")
Скобкисформировать подоболочку, чтобы измененный IFS ограничивался командами в скобках (возможно, вы не захотите, чтобы этот параметр влиял на последующие части скрипта.
При использовании аргументов командной строки, содержащихрасширенные метасимволы регулярных выражений. Например, если вы хотите выполнить поиск литеральной строки foo(bar)
, вам потребуется передать в качестве аргумента что-то вроде foo\(bar\)
(ERE, совпадающее с литеральной строкой), которое вы можете записать как 'foo\(bar\)'
в фактической командной строке.
Наконец, верните ее в исходную команду иell grep
ожидает расширенного регулярного выражения (-E
):
matches=$(IFS=\|; grep -E "^($*) [0-9]+" --count phonelist.txt)
Подстановка команды $()
фактически является своей собственной подоболочкой, поэтому измененное значение IFS не «уйдет» в более поздние частисценария.