Я хотел бы выполнить echo
команду, когда cat /etc/passwd | grep "sysa"
это не так.
Что я делаю не так?
if ! [ $(cat /etc/passwd | grep "sysa") ]; then
echo "ERROR - The user sysa could not be looked up"
exit 2
fi
Я хотел бы выполнить echo
команду, когда cat /etc/passwd | grep "sysa"
это не так.
Что я делаю не так?
if ! [ $(cat /etc/passwd | grep "sysa") ]; then
echo "ERROR - The user sysa could not be looked up"
exit 2
fi
Ответы:
пытаться
if ! grep -q sysa /etc/passwd ; then
grep
возвращает, true
если находит цель поиска, и false
если нет.
Так что НЕ false
== true
.
if
Оценка в оболочках разработана так, чтобы быть очень гибкой, и много раз не требует цепочек команд (как вы написали).
Кроме того, глядя на ваш код как есть, $( ... )
следует приветствовать использование вами формы подстановки cmd, но подумайте о том, что выходит из процесса. Попробуйте echo $(cat /etc/passwd | grep "sysa")
понять, что я имею в виду. Вы можете пойти дальше, используя -c
опцию (count) для grep, а затем выполнить то, if ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; then
что работает, но это довольно старая школа.
НО, вы можете использовать новейшие функции оболочки (арифметическая оценка), такие как
if ! (( $(grep -c "sysa" /etc/passwd) == 0 )) ; then ...`
что также дает вам преимущество использования операторов сравнения на основе c-lang ==,<,>,>=,<=,%
и, возможно, нескольких других.
В этом случае, согласно комментарию Orwellophile, арифметическая оценка может быть урезана еще дальше, например,
if ! (( $(grep -c "sysa" /etc/passwd) )) ; then ....
ИЛИ
if (( ! $(grep -c "sysa" /etc/passwd) )) ; then ....
Наконец, есть награда под названием Useless Use of Cat (UUOC)
. :-) Некоторые люди будут прыгать вверх и вниз и плакать Gothca! Я просто скажу, что grep
может взять имя файла в его cmd-строке, так зачем вызывать дополнительные процессы и конвейерные конструкции, когда это не нужно? ;-)
Надеюсь, это поможет.
grep "^$user:" /etc/passwd
был бы более правильным способом случайного поиска в / etc / passwd - grep -v
где -v инвертирует поиск, если вы хотите чтобы избежать беспорядка ||
(( $( cat file | grep regex | wc -l ) ? 0 : 1 ))
Я думаю, что это может быть упрощено в:
grep sysa /etc/passwd || {
echo "ERROR - The user sysa could not be looked up"
exit 2
}
или в одной командной строке
$ grep sysa /etc/passwd || { echo "ERROR - The user sysa could not be looked up"; exit 2; }
1>&2
в конце вашего echo
для печати stderr
?
!: not found
'grep
как это. -q
подавляет вывод.
Что я делаю не так?
$(...)
содержит значение , а не статус выхода, поэтому этот подход неверен. Тем не менее, в этом конкретном случае это действительно работает, потому что sysa
будет напечатано, что делает утверждение теста. Тем не менее, if ! [ $(true) ]; then echo false; fi
всегда будет печатать, false
потому что true
команда ничего не записывает в стандартный вывод (даже если код выхода равен 0). Вот почему это нужно перефразировать if ! grep ...; then
.
Альтернатива была бы cat /etc/passwd | grep "sysa" || echo error
. Изменить: Как Алекс указал, кот бесполезно здесь : grep "sysa" /etc/passwd || echo error
.
Нашли другие ответы довольно запутанно, надеюсь, это кому-нибудь поможет.
В Unix-системах, которые его поддерживают (кажется, не в MacOS):
if getent passwd "$username" >/dev/null; then
printf 'User %s exists\n' "$username"
else
printf 'User %s does not exist\n' "$username"
fi
Преимущество этого заключается в том, что он запрашивает любую службу каталогов, которая может использоваться (YP / NIS или LDAP и т. Д.), И файл локальной базы паролей.
Проблема в grep -q "$username" /etc/passwd
том, что он даст ложное срабатывание, когда такого пользователя нет, но что-то еще соответствует шаблону. Это может произойти, если в файле есть частичное или точное совпадение.
Например, в моем passwd
файле есть строка
build:*:21:21:base and xenocara build:/var/empty:/bin/ksh
Это может спровоцировать правильное совпадение таких вещей, как cara
и enoc
т. Д., Даже если в моей системе таких пользователей нет.
Чтобы grep
решение было правильным, вам нужно правильно проанализировать /etc/passwd
файл:
if cut -d ':' -f 1 /etc/passwd | grep -qxF "$username"; then
# found
else
# not found
fi
... или любой другой подобный тест по первому из :
полей -delimited.
bash
в этом случае.
Вот ответ в качестве примера:
Чтобы убедиться, что регистраторы данных подключены, cron
каждые 15 минут запускается скрипт, который выглядит следующим образом:
#!/bin/bash
#
if ! ping -c 1 SOLAR &>/dev/null
then
echo "SUBJECT: SOLAR is not responding to ping" | ssmtp abc@def.com
echo "SOLAR is not responding to ping" | ssmtp 4151112222@txt.att.com
else
echo "SOLAR is up"
fi
#
if ! ping -c 1 OUTSIDE &>/dev/null
then
echo "SUBJECT: OUTSIDE is not responding to ping" | ssmtp abc@def.com
echo "OUTSIDE is not responding to ping" | ssmtp 4151112222@txt.att.com
else
echo "OUTSIDE is up"
fi
#
... и так далее для каждого регистратора данных, который вы можете увидеть на странице монтажа по адресу http://www.SDsolarBlog.com/montage
К вашему сведению, используя &>/dev/null
перенаправления всех выходных данных команды, включая ошибки, в/dev/null
(Условный требует только exit status
от ping
команды)
Также, к вашему сведению, обратите внимание, что, поскольку cron
задания выполняются как root
нет необходимости использовать sudo ping
в cron
скрипте.
!
быть внутри скобок? т.е.[ ! EXPR ]