Я хочу обратиться с этим вопросом к следующему посту, в котором я получил Скрипт: Опубликовать со сценарием
Я использую 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 из оболочки и посмотреть, что она делает. Каков его результат? Выполните все шаги до вывода:
/usr/local/nagios/libexec/check_nt -H $2 -p 12489 -s PASSWORD -v USEDDISKSPACE -l $4
/usr/local/nagios/libexec/check_nt -H $2 -p 12489 -s PASSWORD
-v USEDDISKSPACE -l $4 | awk -F"- " '{ print $4 }'
/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: исправлено несколько опечаток