2013-07-11 3 views
0

У меня есть сценарий с этой линии:Спасаясь переменная в Grep заявлении в условном операторе

if [ -z "`/sbin/service mysqld status | grep 'mysqld (.*) is running'`" ] ; then 

Я хочу, чтобы заменить имя службы и Grep регулярное выражение с переменной. Различные версии ОС/MySQL имеют разные имена служб и сообщают о разных статусах. Я устал от редактирования строки в коде. Поэтому я сделал это:

SERVICE_NAME=mysql 
SERVICE_RUNNING_STR="MySQL (.*) running" 
... 
if [ -z "`/sbin/service $SERVICE_NAME status | grep '$SERVICE_RUNNING_STR'`" ] ; then 
... 

За исключением этого не работает. Он выводит SERVICE_RUNNING_STR в команде grep. Я пробовал много комбинаций цитат и других вещей и не получил его на работу. Я не уверен, что нужно встроить в кавычки и тики и одинарные кавычки.

ответ

1

Не используйте одинарные кавычки, они не расширяют переменные. Обратная косая черта в doublequotes:

[ -z "`/sbin/service $SERVICE_NAME status | grep \"$SERVICE_RUNNING_STR\"`" ] 
+0

Arg ... Я знал, что это легко. Думал, что я пробовал это, и это не сработало. В любом случае, потрясающе. Благодарю. – crazy4mustang

1

Вместо того чтобы использовать [ -z ... ], чтобы увидеть, если Grep выводит что-нибудь, просто проверить состояние выхода Grep (и использовать его -q возможность подавить вывод, и, как @choroba указал doublequotes вокруг переменной ссылки):

if ! /sbin/service $SERVICE_NAME status | grep -q "$SERVICE_RUNNING_STR"; then 
+0

+1 Это то, что вы должны использовать. Гораздо меньше подвержено ошибкам, чем попытка получить правильные цитаты, и позволяет избежать накладных расходов на работу с выходом из 'grep'. – chepner

Смежные вопросы