Запись bash условно с вложенной конвейерной командой - PullRequest
0 голосов
/ 12 июля 2020

Следующая команда bash:

aws s3 ls s3://bucket/dir | grep _SUCCESS | wc -l

печатает:

0

Я хочу, когда результат действительно 0, чтобы напечатать ОТКАЗ на терминал.

Это то, что я пробовал:

if [ aws s3 ls s3://bucket/dir | grep _SUCCESS | wc -l = 0]; then echo FAILURE; fi

, но ничего не печатается. похоже, он ждет дополнительных данных.

Ответы [ 2 ]

2 голосов
/ 12 июля 2020

Вам вообще не нужно wc. Если счетчик строк равен нулю, это означает, что grep не произвел вывода, и в этом случае он будет иметь ненулевой статус выхода. Оператор if в любом случае заботится только о статусе выхода.

if ! aws ls s3://bucket/dir | grep -q _SUCCESS; then
    echo FAILURE
fi

! отрицает статус выхода конвейера (который является статусом существования крайнего левого отказа, в противном случае 0), так что вам не нужно писать что-то вроде

if aws ls s3://bucket/dir | grep -q _SUCCESS; then
    :  # Do nothing
else
    echo FAILURE
fi

grep -q подавляет его вывод, поскольку вас интересует только статус выхода, а не фактический вывод.

Строго говоря, grep имеет статус выхода 1, если совпадения нет, и другое ненулевое значение, обычно 2, если действительно есть ошибка. Если вам интересно, вам нужно явно проверить значение $? после запуска команды.

aws ls s3://bucket/dir | grep -q _SUCCESS
case $? in
    0) : ;;
    1) echo FAILURE ;;
    *) echo "Some other error" ;;
esac
    
1 голос
/ 12 июля 2020

как насчет:

if [ "$(aws s3 ls s3://bucket/dir | grep _SUCCESS | wc -l)" -eq 0 ]; then echo FAILURE; fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...