У меня есть переменная с именем Seconds_Behind_Master
из одного из моих скриптов. Проблема заключается в том, что эта переменная может иметь числовое значение или принимать в качестве значения строку NULL
. Теперь, когда я пытаюсь выполнить этот скрипт в оболочке, он запускается, но выдает следующее предупреждение:
[: Illegal number: NULL
Я полагаю, что это связано с тем, что в этом случае значение равно NULL
, но когда он сравнивает его с числовым значением 60
, которое выдает это предупреждение. Как я могу исправить это?
В этом случае вы должны использовать арифметическую оценку - (( expression ))
:
if (( $Seconds_Behind_Master >= 60 )); then
echo "replication delayed > 60."
elif [ "$Seconds_Behind_Master" = "NULL" ]; then
echo "Delay is Null."
fi
<час> Если вы хотите соблюдать стандарт POSIX, то вы можете использовать:
if echo $Seconds_Behind_Master | egrep -q '^[0-9]+ Подробнее о: Оболочка - проверка числовой переменной .
&& [ "$Seconds_Behind_Master" -ge "60" ] ; then
echo "replication delayed >= 60."
elif [ "$Seconds_Behind_Master" = "NULL" ]; then
echo "Delay is Null."
fi
Подробнее о: Оболочка - проверка числовой переменной .
Сначала проверьте, является ли переменная NULL
, затем проверьте, является ли она >= 60
. Рассмотрим этот код:
if [ "$Seconds_Behind_Master" = "NULL" ]; then
echo "Delay is Null."
elif [ "$Seconds_Behind_Master" -ge 60 ] 2>/dev/null; then
echo "replication delayed >= 60."
else
echo "Seconds_Behind_Master is neither NULL or >= 60"
fi
Вы также можете заменить строку
elif [ "$Seconds_Behind_Master" -ge 60 ] 2>/dev/null; then
на
elif [[ "$Seconds_Behind_Master" -ge 60 ]]; then
, если вы предпочитаете это и используете оболочку, которая поддерживает [[
синтаксис.
Seconds_Behind_Master
не будет установлен или будет равен, например, с blahblah
.
– Neil
14.05.2020, 01:57
NULL
, и разве это не генерирует ошибку, снова говоря, что ПУСТОЙ УКАЗАТЕЛЬ является строкой, и Вы сравниваете его с числом???
– Dennis Williamson
14.05.2020, 01:57