Сравните переменную, которая может иметь числовое значение или строку в качестве значения

У меня есть переменная с именем Seconds_Behind_Master из одного из моих скриптов. Проблема заключается в том, что эта переменная может иметь числовое значение или принимать в качестве значения строку NULL. Теперь, когда я пытаюсь выполнить этот скрипт в оболочке, он запускается, но выдает следующее предупреждение:

[: Illegal number: NULL

Я полагаю, что это связано с тем, что в этом случае значение равно NULL, но когда он сравнивает его с числовым значением 60, которое выдает это предупреждение. Как я могу исправить это?

2
задан 27 February 2014 в 17:26

2 ответа

В этом случае вы должны использовать арифметическую оценку - (( 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

Подробнее о: Оболочка - проверка числовой переменной .

0
ответ дан 27 February 2014 в 17:26

Сначала проверьте, является ли переменная 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

, если вы предпочитаете это и используете оболочку, которая поддерживает [[ синтаксис.

0
ответ дан 27 February 2014 в 17:26

Другие вопросы по тегам:

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