Задать вопрос
juffinhalli
@juffinhalli

[РЕШЕНО]Объясните, что делает этот bash скрипт

Добрый вечер, хабражители!

Некий форматированный текст передаётся демоном по STDIN в sh скрипт:

#!/bin/sh
     while read x y
     do  case "$x$y" in
             '') exec logger -t collectd${severity+" $severity" -p user."$severity"};;
             Severity:WARNING) severity=warning;;
             Severity:OKAY)    severity=notice;;
             Severity:FAILURE) severity=err;;
         esac
     done

Образец текста:
Severity: FAILURE
  Time: 1200928930
  Host: myhost.mydomain.org
  \n
  This is a test notification to demonstrate the format

Но что при этом происходит никак разобраться не могу.
Вижу цикл… а дальше не понятно.

Просьба помочь по следующим вопросам:
Что происходит (пошагово) при выполнении скрипта?
Как самостоятельно передать по STDIN произвольный текст в этот скрипт?
Как модифицировать скрипт чтобы этот произвольный текст был записан в файл, а не в syslog?

Заранее спасибо.

UPD. Спасибо за помощь, но один момент остался неясным — как весь входящий текст перенаправить в файл

UPD2 Разобрался. Нужно делать так

#!/bin/sh
read severity
read time
echo $severity >> file
echo $time >> file
  • Вопрос задан
  • 4624 просмотра
Подписаться 2 Оценить 2 комментария
Решения вопроса 1
read x y — читает строку, делит её по пробелам, как shell делит аргументы командной строки на отдельныйе аргументы. Первый и второй блок присваивает переменным x и y соответственно.
Далее считанная строка анализируется. Если считана комбинация Severity:WARNING (OK, FAILURE), то соответсвующее значение записывается в переменную severity. Если строка пустая, то запускается logger с нужными параметрами. Остальные строки игнорируются.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Skpd
@Skpd
Идёт построчное чтение. В переменную $x попадает первое слово, в $y второе.
Далее в переменную $severity устанавливается значение в зависимости $x и $y.
При попадании на пустую строку производится запись в лог.

Для записи в файл измените 4 строчку на что-то в стиле
'') echo "severity: $severity" > test.log;;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы