Захватите вывод bash и сравните его со строкой текста

Я только что присоединился к Stackru, потому что мне нужна помощь. Я занимался базовым управлением нашего сервера Red Hat, потому что на нем мы запускаем Nagios, но меня попросили написать несколько сценариев для мониторинга нашей среды SAP.

Я изменил серверы SAP и плагин CCMS, чтобы восстановить вывод, который нам нужен:

EU_PUT History = EU_PUT | 00101401 | Afgebroken |, запущено в 2016-10-20,00:10:18 прекращено в 2016-10-20,00:10:18

Я хочу использовать захваченный вывод (^) и проверить, содержит ли он слово "Beënd". Если это так, это означает, что задание завершилось успешно, если это не так, это означает, что задание не выполнено (независимо от состояния сбоя). Что бы я ни делал, скрипт не улавливает на выходе. Вывод успешно отображается при запуске приведенного ниже сценария, но сравнение не работает.

Что я делаю неправильно? Любая помощь будет принята с благодарностью!

С наилучшими пожеланиями, Деннис Ланс

   #!/bin/bash
    T1="*Beënd*"

    #For Nagios reporting purposes:
    unknown="0"
    ok="1"
    warning="2"
    critical="3"

    output=$(/usr/local/nagios/libexec/check_sap job_eu_put lnx '2>&1')

    if [[ "$output" == "$T1" ]]
        then
            echo $output
            exit $ok
        else
            echo $output
            exit $critical

    fi

3 ответа

Решение

Включение перенаправлений в кавычки не является хорошей практикой. Что еще более важно, ваше заявление if [[ "$output" == "$T1" ]] делает строгое сравнение, не спрашивает, $T1 подстрока $output, Вы должны использовать [[ "$output" == *"$T1"* ]] для этого. Это * не должны быть помещены в кавычки, как вы в своем определении вашего T1 переменная:

#!/bin/bash
T1="Beënd"

#For Nagios reporting purposes:
unknown="0"
ok="1"
warning="2"
critical="3"

output=$(/usr/local/nagios/libexec/check_sap job_eu_put lnx '2>&1')

if [[ "$output" == *"$T1"* ]]
    then
        echo $output
        exit $ok
    else
        echo $output
        exit $critical

fi

Для начала, вы не перенаправляете стандартную ошибку должным образом. Когда вы заключаете перенаправление в кавычки, как у вас есть с '2>&1'вы на самом деле просто передаете строку в качестве аргумента. Например:

$ echo foo '>/dev/null'
foo >/dev/null

После того, как вы исправите перенаправление, вы также можете убедиться, что ваша выходная переменная содержит значения, которые, по вашему мнению, должны. Распространенным источником ошибок является сравнение строк, когда одна из строк содержит символы новой строки или пробелы в начале / конце.

Удалите кавычки перенаправления stderr к stdout из 2>&1

  output=$(blah 2>&1)
  echo $output
  No command 'blah' found, did you mean: Command 'blam' from package 'blam' (universe) blah: command not found
Другие вопросы по тегам