Как сделать «если не истинное состояние»?

Я хотел бы иметьecho команда выполняется когдаcat /etc/passwd | grep "sysa" неправда.

Что я делаю неправильно?

<code>if ! [ $(cat /etc/passwd | grep "sysa") ]; then
        echo "ERROR - The user sysa could not be looked up"
        exit 2
fi
</code>
 Charles Duffy11 мая 2012 г., 16:25
@ acraig5075 это так или иначе, но в этом утверждении вообще нет необходимости в тестовой команде (каковы скобки).
 acraig507511 мая 2012 г., 16:00
Должен! не быть в скобках? то есть[ ! EXPR ]

Ответы на вопрос(5)

Я думаю, это можно упростить до:

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; }

 tbc027 июл. 2016 г., 00:04
Избегайте перенаправления вывода при использовании'grep так.-q подавляет вывод.
 Julien26 нояб. 2015 г., 12:32
Мне нравится эта версия. Как насчет добавления1>&2 в конце твоегоecho печатать наstderr ?
 ceving14 мар. 2016 г., 14:29
@ 0zkrPM Но версия оболочки не работает в оболочке Bourne. Ты получишь!: not found
 0zkr PM19 сент. 2014 г., 00:03
Замечательно, но я предпочитаю ответ мистера Шеллтера, потому что он «самодокументирован», более «читабелен» для программиста.
Решение Вопроса

пытатьс

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,==,<,>,>=,<=,% и, может быть, несколько других.

В этом случае, согласно комментарию Орвеллофила, арифметическая оценка может быть еще более уменьшена, например,

if ! (( $(grep -c "sysa" /etc/passwd) )) ; then ....

ИЛ

if (( ! $(grep -c "sysa" /etc/passwd) )) ; then ....

Наконец-то есть Награду называетсяUseless Use of Cat (UUOC). :-) Некоторые люди будут прыгать вверх и вниз и плакать Gothca! Я просто скажу, чтоgrep может взять имя файла в его cmd-строке, так зачем вызывать дополнительные процессы и конвейерные конструкции, когда это не нужно? ; -)

Надеюсь, это поможет

 shellter01 июн. 2015 г., 19:05
да, ну, есть решение проблемы наиболее эффективно, а затем есть ответ на конкретный вопрос. Я пытался ответить на конкретный вопрос. Спасибо за ваши идеи. Всем удачи
 Orwellophile01 июн. 2015 г., 18:59
Это все довольно глупо, от моего ответа на гораздо более сложный вопрос ( Stackoverflow.com / а / 30400327/912236] grep "^$user:" /etc/passwd был бы более правильный способ поиска / etc / passwd случайно -grep -v где -V инвертирует поиск, если вы хотите избежать беспорядка ||
 Orwellophile01 июн. 2015 г., 19:12
не ковыряюсь в твоих ответах, вполне им понравился. я только что добавил бы правильную ограниченную проверку имени пользователя, иначе, если ОП действительно выполняет поиск по "sys" или что-то подобное, он получит довольно неожиданный результат. еще один для дороги?(( $( cat file | grep regex | wc -l ) ? 0 : 1 ))

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

... или любой другой подобный тест против первого из: -ограниченные поля.

 Kusalananda08 нояб. 2017 г., 11:35
@ SDsolar Ваш код, вероятно, не выполняетсяbash в таком случае

$(...) держитценност, а не статус выхода, поэтому такой подход неверен. Однако в данном конкретном случае это действительно работает, потому что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.

Нашли другие ответы довольно запутанно, надеюсь, это кому-нибудь поможет.

 Alex Yaroshevich11 сент. 2017 г., 23:34
илиgrep "sysa" /etc/passwd || echo error
 Blauhirn12 сент. 2017 г., 02:31
@ AlexYaroshevich да, ты прав, я добавил, что

Вот пример ответа:

Чтобы убедиться, что регистраторы данных подключены к сетиcron скрипт запускается каждые 15 минут и выглядит так:

#!/bin/bash
#
if ! ping -c 1 SOLAR &>/dev/null
then
  echo "SUBJECT:  SOLAR is not responding to ping" | ssmtp [email protected]
  echo "SOLAR is not responding to ping" | ssmtp [email protected]
else
  echo "SOLAR is up"
fi
#
if ! ping -c 1 OUTSIDE &>/dev/null
then
  echo "SUBJECT:  OUTSIDE is not responding to ping" | ssmtp [email protected]
  echo "OUTSIDE is not responding to ping" | ssmtp [email protected]
else
  echo "OUTSIDE is up"
fi
#

... и т. д. для каждого регистратора данных, который вы можете увидеть в монтаже наhttp: //www.SDsolarBlog.com/montag

FYI, используя&>/dev/null перенаправляет весь вывод команды, включая ошибки, на/dev/null

(Условное требует толькоexit status изping команда)

Кроме того, обратите внимание, что сcron задания выполняются какroot нет необходимости использоватьsudo ping вcron скрипт.

Ваш ответ на вопрос