Здравствуйте уважаемы участники. Мне необходимо программно проверить конфигурацию NGINX на корректность с помощью bash. Результат команды nginx -t присваивается переменной и по условию я сравниваю подстроку - syntax is ok с результатом вывода переменной. К сожалению не получается. Что я делаю не так?
CHECK="nginx -t"
SUB='syntax is ok'
if [[ "eval $CHECK" == *"$SUB"* ]]; then
echo "syntax is ok"
else
echo "syntax is not ok"
fi
Павел, Добрый день. Это реально работает. Просто супер! Первая строка присваивает 1 если конфигурация не верна, и 0 если проверка прошла успешно? В любом случае спасибо!
Понял Павел, так, согласен, намного эффективнее, интересно почему же все же не находилась подстрока в строке по моему сценарию? Всю голову сломал. Видимо это было просто невозможно.
podguzovvasily, ошибка в кавычках в первой строке: CHECK="nginx -t". В данном случае вы присваиваете переменной $CHECK значение nginx -t, а не результат выполнения команды. Если нужен результат, то надо использовать CHECK=`nginx -t` или CHECK=$(nginx -t). Но даже в этом случае вы не получите результата, так как необходимый вам текст nginx выводит в стандартный поток ошибок. Нужно добавить соответствующее перенаправление: CHECK=`nginx -t 2>&1`. Итоговый код:
CHECK=`nginx -t 2>&1`
SUB='syntax is ok'
if [[ "eval $CHECK" == *"$SUB"* ]]; then
echo "syntax is ok"
else
echo "syntax is not ok"
fi
Павел спасибо еще раз огромное, и хотя команда eval $CHECK возвращала результат даже при присвоении переменной CHECK команды в кавычках "nginx -t". Сравнить подстроку не удавалось, как я понял, как раз потому что вывод nginx -t как впрочем и nginx -v, не является текстом, соответственно и сравнить он эти значения попросту не мог. Спасибо еще раз, буду разбираться подробнее в этом вопросе.
Все верно, с первым пунктом я поступал точно также вначале, также были и варианты указанные Вами выше:
CHECK=$(nginx -t)
echo "Result: $CHECK"
и
CHECK=`nginx -t`
echo "Result: $CHECK"
но только eval давал корректное присвоение с двойными кавычками:
CHECK="nginx -t"
eval $CHECK
Я сразу подозревал что осуществляю поиск в том, в чем его нельзя осуществить но никак не мог понять почему, я даже пытался сделать вывод в файл для дальнейшего взятия результата (хотя это костыль):
eval $CHECK > result
Но файл был пустой. Копируемый результат в консоли сбивал меня с толку.