Як протестувати (в один рядок), якщо вихід команди містить певний рядок?


76

В одному рядку bash, як повернути статус виходу 0, коли вихідні дані /usr/local/bin/monit --versionне містять точно, 5.5і статус виходу 1, коли це відбувається?

Відповіді:


104
! /usr/local/bin/monit --version | grep -q 5.5

( grepповертає статус виходу 0, якщо він знаходить збіг, і в протилежному випадку 1. -qОпція, "тихо", говорить йому не друкувати жодного збігу, який він знаходить; іншими словами, він повідомляє, grepщо єдине, що ви хочете, це його повернення -value. На !початку інвертує статус виходу всього трубопроводу.)

Відредаговано, щоб додати: Або, якщо ви хочете зробити це в "чистому Bash" (а не викликати grep), ви можете написати:

[[ $(/usr/local/bin/monit --version) != *5.5* ]]

( [[...]]пояснюється в п. 3.2.4.2 "Умовні конструкції" Довідкового посібника Bash . так *5.5*само, як у файлових глобусах: нуль або більше символів, плюс 5.5, плюс нуль або більше символів.)


Геніальний геній! Потужність труби постійно вражає.
Джошуа Пінтер

Чи є хтось, щоб повторити значення і того, /usr/local/bin/monit --versionколи воно зазнає невдачі?
Джошуа Пінтер,

@JoshuaPinter: Будь ласка, поясніть - що ви маєте на увазі під словом "коли це не вдається"? (Який напрямок "провал"?)
ruahh

@ruakh Коли код виходу 1, чи може він відображати monit --versionзначення під час виходу зі статусом 1?
Джошуа Пінтер,

1
@JoshuaPinter: Це здається еквівалентом monit --version; monit --version | grep -q 5.5; але я здогадуюсь, що ти хотів використовувати grep -qзамість голого grep? У цьому випадку ви можете трохи спростити monit --version | grep -q 5.5 || (monit --version; false). І - чи monit --versionнадрукує колись кілька рядків? Якщо ні, тоді ви можете спростити до просто ! monit --version | grep -v 5.5.
ruahh

27
[ $(/usr/local/bin/monit --version) == "5.5" ] 

напр.-1: перевірити успіх

[ $(/usr/local/bin/monit --version) == "5.5" ] && echo "OK"

напр.-2: перевірка на відмову

    [ $(/usr/local/bin/monit --version) == "5.5" ] || echo "NOT OK"

або, щоб просто перевірити, чи містить вихідні дані 5.5:

[[ $(/usr/local/bin/monit --version) =~ "5.5" ]] || echo "NOT OK"

"5,5" буде частиною більшої кількості випуску.
Дейн О'Коннор,

@perreal - Ви не можете цитувати регулярний вираз у bash, це робить його буквальним рядком, а не регулярним виразом. (цитування працює в деяких старих версіях bash, але було виправлено як помилку).
jordanm

@jordanm, це не правильно. Якщо ви не цитуєте 5.5, він також буде відповідати 5a5. Лапки роблять крапку рядком.
перреаль

1
@perreal Я щойно тестував. [[ "5a5" =~ "5.5" ]] && echo yesне друкує нічого, крім [[ "5a5" =~ 5.5 ]] && echo yesдруку так. Процитована версія працює у zsh, але не в bash.
jordanm

2

Перевірте повернене значення grep:

sudo service xyz status | grep 'not' &> /dev/null
if [ $? == 0 ]; then
   echo "whateveryouwant"
fi

Я б порекомендував cron, він чудово працює із стеком SALT

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.