Сценарий обнаружил ошибку, но всегда переходит в состояние 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
0
thichxai 18 Янв 2022 в 19:56
1
[ "$CHECK" = "$ERROR" ] было бы наиболее правильным, но проблема здесь, похоже, в том, что CHECK не имеет того значения, о котором вы думаете. Обязательно запустите это через shellcheck.net и исправьте ошибки, на которые он указывает.
 – 
chepner
18 Янв 2022 в 20:00
2
Почему бы не просто if grep -qi $i "^Error:"? Нет необходимости ни в бесполезных cat или cut, ни в ERROR или CHECK переменных.
 – 
Thomas
18 Янв 2022 в 20:01
Вы уверены, что слово Ошибка будет в первом поле?
 – 
stark
18 Янв 2022 в 20:02
И заметьте: почему, по-вашему, ОС должна быть в названии?
 – 
GhostCat
18 Янв 2022 в 20:43

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
0
arnaudm 18 Янв 2022 в 19:59

Вы используете 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
0
John Bollinger 18 Янв 2022 в 20:40

Есть две вещи, которые я бы посоветовал и которые могут решить вашу проблему:

  1. Добавьте #!/bin/bash в первую строку, чтобы убедиться, что он интерпретируется как bash, а не как sh. Много раз у меня были проблемы со сравнением из-за этого

  2. При сравнении двух переменных используются двойные скобки ([[ и ]]). Кроме того, если это строки, всегда заключайте их в кавычки "$ERROR". Он отсутствует для переменной $ERROR.

Посмотрите и на другие ответы, есть много способов сделать то же самое гораздо проще.

Примечание. При сравнении чисел следует использовать -eq

0
vinalti 18 Янв 2022 в 20:43
Числа здесь не сравниваются; нет смысла упоминать -eq.
 – 
chepner
18 Янв 2022 в 20:01
Да, поправил.
 – 
vinalti
18 Янв 2022 в 20:05
Это всего лишь два совета, а не ответы на вопрос.
 – 
chepner
18 Янв 2022 в 20:36