Я пытаюсь создать скрипт, в котором пользователь может ввести 3 разных аргумента (имена пользователей), чтобы проверить, находится ли он в сети.
В настоящее время у меня есть, who | grep "^$1"
который выводит на экран того, кого ищут, но когда я пытаюсь добавить $2 и $3, например
who | grep "^$1" "^$2" "^$3"
выдает ошибку, говорящую, что нет такого файла или каталога, но работает нормально, когда у меня есть только один аргумент. Есть предложения?
решение1
who | grep -e "^$1" -e "^$2" -e "^$3"
следует сделать
решение2
Grep ведет себя по-разному в зависимости от типа используемого движка регулярных выражений. По умолчанию он используетБазовые регулярные выраженияно также может использоватьРасширенные регулярные выраженияс -E
и, в grep
версиях, которые поддерживают эту функцию, Регулярные выражения, совместимые с Perlс -P
.
BRE может искать только два шаблона, не больше. Синтаксис:
grep 'pattern1\|pattern2'
ERE и PCRE могут искать произвольное число, в этом отношении их синтаксис одинаков, меняется только флаг опции:
grep -E 'pattern1|pattern2|pattern3|patternN'
grep -P 'pattern1|pattern2|pattern3|patternN'
Итак, в вашем случае вы могли бы сделать что-то вроде:
who | grep -E "^$1|^$2|^$3"
решение3
Я бы рекомендовал сделать что-то вроде этого:
who | awk '{print $1}'
awk выведет первый столбец имен пользователей, которые в данный момент находятся в системе.
Как отметил Тердон, если сузить вопрос до трех аргументов:
who | awk -v one=$1 -v two=$2 -v three=$3 '$1==one||$1==two||$1==three'