В одному рядку bash, як повернути статус виходу 0, коли вихідні дані /usr/local/bin/monit --versionне містять точно, 5.5і статус виходу 1, коли це відбувається?
В одному рядку bash, як повернути статус виходу 0, коли вихідні дані /usr/local/bin/monit --versionне містять точно, 5.5і статус виходу 1, коли це відбувається?
Відповіді:
! /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коли воно зазнає невдачі?
monit --versionзначення під час виходу зі статусом 1?
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.
[ $(/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"
[[ "5a5" =~ "5.5" ]] && echo yesне друкує нічого, крім [[ "5a5" =~ 5.5 ]] && echo yesдруку так. Процитована версія працює у zsh, але не в bash.