Для отладки, что происходит с вашим испытанием, запустить один шаг за один раз.
Сначала сделайте service --status-all
сам и проверьте его выход. Является ли вывод тем, что вы ожидаете от него, и действительно ли он включает в себя «Мое обслуживание», для которого вы используете grepping?
Затем запустите service --status-all | grep 'My Service'
и проверьте его код выхода и выхода. Выписывает ли он совпадение, и это код выхода 0
?
man grep
говорит нам, что:
The grep utility exits with one of the following values:
0 One or more lines were selected.
1 No lines were selected.
>1 An error occurred.
, а также
-q, --quiet, --silent
Quiet mode: suppress normal output. grep will only search a file until a
match has been found, making searches potentially less expensive.
Есть также улучшения в этом процессе, что вы можете сделать ...
if
проверяет статус возвращения из который выполняется, и если этот статус равен нулю, выполняется ветвь then
. Зная это, вы можете просто проверить статус возврата grep
вместо статуса возврата test
.
в сторону:
Вы используете [
команду, которая также команда test
(попробуйте man test
)
The test
команда выходит с 0, когда тест пройден (успешно), или 1, если тест терпит неудачу.
$ test 7 -eq 7;echo $?
0
$ test 7 -ne 7;echo $?
1
$ [ 7 -eq 2 ];echo $?
1
С этим знанием, опять же, вы можете непосредственно проверить код выхода Grep. Выход
Подавить Grep с «тихим» флагом вместо перенаправления, и использовать grep -F
для фиксированных строк, который а.к.а. fgrep
:
if ./service --status-all | fgrep -q 'My Servvice'
then
echo "Service IS there."
else
echo "Service NOT there."
fi
0 означает успех, как и то, что происходит, когда Grep находит свой образец. Поэтому, возможно, ваше условное выражение перевернуто. – bishop
Возможно, _Service_ написана с ошибкой в 'grep 'My Serivice'' (SerIvice)? –
nah, имя верно, я пропустил его в этом вопросе, извините –