Сценарий обнаружил ошибку, но всегда переходит в состояние Else «Ошибка не найдена». Мне не хватает, как сравнить две переменные?
ERROR="Error:"
for i in `find /logs -mtime -1`
do
CHECK=`cat $i |grep -i "Error"|cut -f 1 -d " "`
if [ "$CHECK" == $ERROR ]
then
echo "Found Error"
else
echo "Not Found Error"
fi
done
3 ответа
Вы пробовали что-то вроде if [[ "$CHECK" == $ERROR ]]
?
Чтобы просто обнаружить ошибку, не печатая сообщение об ошибке, вы можете использовать
CHECK=$(cat $i | grep "Error" | wc -l)
if [[ $CHECK -ne 0 ]]
then
echo "Found error"
else
echo "Not found error"
fi
Вы используете grep -i
для сопоставления без учета регистра, но затем проверяете результат на точное равенство со строкой Error:
. Если важно совпадение без учета регистра, то проверка на точное равенство не является подходящим дополнением.
Вы также захватываете потенциально многострочный вывод и сравниваете его со строкой, которая может быть результатом только однострочного вывода.
И вы сопоставляете «Ошибка:» в любом месте строки, но предполагаете, что она появится в начале.
В целом, вы идете по этому очень запутанному пути, так как grep
сообщает вам через свой статус выхода, нашел ли он какие-либо совпадения. Например:
#!/bin/bash
for log in `find /logs -mtime -1`; do
if grep -i -q '^Error:' "$log"; then
echo "Found Error"
else
echo "Not Found Error"
fi
done
Есть две вещи, которые я бы посоветовал и которые могут решить вашу проблему:
Добавьте
#!/bin/bash
в первую строку, чтобы убедиться, что он интерпретируется как bash, а не как sh. Много раз у меня были проблемы со сравнением из-за этогоПри сравнении двух переменных используются двойные скобки (
[[
и]]
). Кроме того, если это строки, всегда заключайте их в кавычки"$ERROR"
. Он отсутствует для переменной$ERROR
.
Посмотрите и на другие ответы, есть много способов сделать то же самое гораздо проще.
Примечание. При сравнении чисел следует использовать -eq
-eq
.
Похожие вопросы
Новые вопросы
bash
Для вопросов о скриптах, написанных для командной оболочки Bash. Для сценариев оболочки с ошибками / синтаксическими ошибками, пожалуйста, проверьте их с помощью программы shellcheck (или на сервере веб-проверки оболочки по адресу https://shellcheck.net) перед размещением здесь. Вопросы об интерактивном использовании Bash, скорее всего, будут касаться темы Super User, а не переполнения стека.
[ "$CHECK" = "$ERROR" ]
было бы наиболее правильным, но проблема здесь, похоже, в том, чтоCHECK
не имеет того значения, о котором вы думаете. Обязательно запустите это через shellcheck.net и исправьте ошибки, на которые он указывает.if grep -qi $i "^Error:"
? Нет необходимости ни в бесполезныхcat
илиcut
, ни вERROR
илиCHECK
переменных.