Назад | Перейти на главную страницу

Ошибка синтаксиса nagios bash

Я хочу обратиться с этим вопросом к следующему посту, в котором я получил Скрипт: Опубликовать со сценарием

Я использую Bash 4.1.2 (1), и когда я пытаюсь выполнить сценарий, я получаю следующие сообщения об ошибках:

 ./check_disk_by_size.sh: Zeile 9: [: ==: Einstelliger (unärer) Operator erwartet.
(standard_in) 1: syntax error
./check_disk_by_size.sh: Zeile 13: [: -eq: Einstelliger (unärer) Operator erwartet.
(standard_in) 1: syntax error
(standard_in) 1: syntax error
./check_disk_by_size.sh: Zeile 16: [: Zu viele Argumente.
(standard_in) 1: syntax error
./check_disk_by_size.sh: Zeile 19: [: -eq: Einstelliger (unärer) Operator erwartet.

У меня есть базовый опыт написания сценариев на Bash, но всякий раз, когда я что-то меняю, я получаю еще больше ошибок. Я не могу заставить его работать.

РЕДАКТИРОВАТЬ 1: Вот сценарий

#!/bin/bash

FREESPACE=`/usr/local/nagios/libexec/check_nt -H $2 -p 12489 -s PASSWORD \
-v USEDDISKSPACE -l $4 | awk -F"- " '{ print $4 }' | awk -F "|" '{ print $1 }'`

SIZE=`echo $FREESPACE | awk '{ print $2 }'`
UNIT=`echo $FREESPACE | awk '{ print $3 }'`

if [ $UNIT == "Gb" ]; then
    SIZE=`echo $SIZE \* 1024 | bc`
fi

if [ `echo "$SIZE >= $6" | bc` -eq 1 ]; then
    echo "$4:\_Drive_Space OK - $FREESPACE"
    exit 0
elif [ `echo "$SIZE < $6" | bc` -eq 1 -a `echo "$SIZE > $8" | bc` -eq 1 ]; then
    echo "$4:\_Drive_Space WARNING - $FREESPACE"
    exit 1
elif [ `echo "$SIZE <= $8" | bc` -eq 1 ]; then
    echo "$4:\_Drive_Space CRITICAL - $FREESPACE"
    exit 2
fi

Я запускаю сценарий так:

./check_disk_by_size -H [IP_Adress] -l [DRIVE] -w [INTEGER] -c [INTEGER] -p [PORT] -s [PASSWORD]

Пример:

./check_disk_by_size -H 192.168.1.110 -l c -w 10240 -c 8192 -p 12489 -s PASSWORD

ОБНОВИТЬ

Спасибо за вашу помощь! Теперь он работает :) Теперь скрипт выглядит так:

#!/bin/bash
#

FREESPACE=`/usr/local/nagios/libexec/check_nt -H $2 -p 12489 -s Nag4AlphA \
-v USEDDISKSPACE -l $4 | awk -F"- " '{ print $4 }' | awk -F "|" '{ print $1 }'`

SIZE=`echo $FREESPACE | awk '{ print $2 }'`
UNIT=`echo $FREESPACE | awk '{ print $3 }'`

if [ "$UNIT" == "Gb" ]; then
    SIZE="$(echo "$(($SIZE * 1024))" | bc)"
fi


echo $SIZE
echo " " 
echo $6
echo " "
echo $8

if [ $SIZE -ge $6 ]; then
    echo "$4:\_Drive_Space OK - $FREESPACE"
    exit 0
elif [ $SIZE -lt $6 -a $SIZE -gt $8 ]; then
    echo "$4:\_Drive_Space WARNING - $FREESPACE"
    exit 1
elif [ $SIZE -lt $8 ]; then
    echo "$4:\_Drive_Space CRITICAL - $FREESPACE"
    exit 2
fi

Мне кажется, что левый операнд в «if test» пуст.

Около Зачем там может быть пустое значение, я предлагаю вам запустить команду Nagios из оболочки и посмотреть, что она делает. Каков его результат? Выполните все шаги до вывода:

  1. /usr/local/nagios/libexec/check_nt -H $2 -p 12489 -s PASSWORD -v USEDDISKSPACE -l $4

  2. /usr/local/nagios/libexec/check_nt -H $2 -p 12489 -s PASSWORD -v USEDDISKSPACE -l $4 | awk -F"- " '{ print $4 }'

  3. /usr/local/nagios/libexec/check_nt -H $2 -p 12489 -s PASSWORD -v USEDDISKSPACE -l $4 | awk -F"- " '{ print $4 }' | awk -F "|" '{ print $1 }'

По поводу самого скрипта "любезно предлагаю":

  • ВСЕГДА заключайте переменные в двойные кавычки, ГДЕ УГОДНО
  • ВСЕГДА предпочитаю $() вместо обратных кавычек для расширения оболочки, ГДЕ УГОДНО
  • ВСЕГДА заключите расширение оболочки в двойные кавычки, ГДЕ УГОДНО

Конечно, исключения применяются редко, например, при проверке числовых значений.

Я не хочу показаться грубым, просто убедитесь, что вы понимаете, насколько это важно :)

Оригинал:

if [ $UNIT == "Gb" ]; then
    SIZE=`echo $SIZE \* 1024 | bc`
fi

Закаленный:

if [ "$UNIT" == "Gb" ]; then
    SIZE="$(echo "$SIZE * 1024" | bc)"
fi

У меня никогда не было проблем после того, как я начал последовательно следовать этим правилам.

Вот хорошая статья о лучших методах написания сценариев Bash: http://www.davidpashley.com/articles/writing-robust-shell-scripts/ и еще один о расширении оболочки http://mywiki.wooledge.org/BashFAQ/082

UDPATE: исправлено несколько опечаток