#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 или BSDsed
с-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 $?
для поиска кода выхода последней команды. Определенно нужно узнать больше о тонких различиях в вариантах регулярных выражений. 🙂