Как я могу повторить «pass» или «fail» после последовательности bash, curl, grep?

#bash #macos #curl #sed #grep

#bash #macos #curl #sed #grep

Вопрос:

Я большой поклонник элегантных однострочников. Я пытаюсь написать однострочный тест, который выводит «pass» или «fail» после выполнения http-запроса и поиска. Я пробовал что-то вроде этого:

 curl "http://haystack.io" | sed 's/.*?needle.*/PASS/' || echo FAIL
  

… но это не завершается должным образом.

Также пробовал:

 curl "http://haystack.io" | if [$(grep -oE "needle") = "needle"]; then echo PASS; else echo FAIL; fi
  

… но я не могу получить правильный синтаксис.

Как я могу это сделать?

Комментарии:

1. проверка оболочки. net — ваш друг — как правило, исправление найденных ошибок — хорошее место для начала.

2. Кстати, использование ? для изменения того, является ли предыдущее * жадным, является PCREism; он недоступен ни в BRE (который sed по умолчанию использует каждый POSIX-совместимый), ни в ERE (который может быть включен в GNU или BSD sed с -r -E аргументами или соответственно).

3. Попробуйте curl "http://haystack.io" | grep -q needle amp;amp; echo PASS || echo FAIL . Предостережение: echo может произойти сбой, если стандартный вывод недоступен для записи.

4. @alvits, ворчите, ворчите, повторяю: поощряйте людей относиться a amp;amp; b || c к троичному, которым это не является. 🙂

5. @CharlesDuffy — Я полностью согласен с вами, но я никоим образом не поощряю OP. Мое предложение состояло в том, чтобы просто исправить его неудачную попытку. Поощрение других читателей непреднамеренно: (

Ответ №1:

Если вы просто ищете иглу, вы можете использовать grep -q для получения кода выхода:

 if curl "http://haystack.io" | grep -q needle
then
  echo "PASS"
else
  echo "FAIL"
fi
  

Проблема с вашим подходом:

 curl "http://haystack.io" | sed 's/.*?needle.*/PASS/' || echo FAIL
  

это sed всегда возвращает успех, когда выражение допустимо, даже если замена не срабатывает. Кроме того, он использует BRE, в то время как ваше регулярное выражение является PCRE.

В этом:

 curl "http://haystack.io" | if [$(grep -oE "needle") = "needle"]; then echo PASS; else echo FAIL; fi
  

вам не хватает кавычек и интервалов (shellcheck поможет с этим), и это также не работает, если есть несколько совпадений.

Комментарии:

1. Большое спасибо! Я узнал больше о кодах выхода, перенаправлении bash и использовании echo $? для поиска кода выхода последней команды. Определенно нужно узнать больше о тонких различиях в вариантах регулярных выражений. 🙂