#!/bin/bash
int_value=-123
if [[ ! "$int_value" =~ "^-?[0-9]+$" ]]; then
echo "You specified not integer value: $int_value"
else
echo "Integer value: $int_value"
fi
Странность заключалась в том, что код выдавал ошибку для вполне целочисленных значений.
$ bash ./test.sh You specified not integer value: -123
А если запустить его через zsh, то все работало верно:
$ zsh ./test.sh Integer value: -123
В принципе можно было заменить код на
#!/bin/bash
int_value=-123
if echo "$int_value" | grep -qE '^-?[0-9]+$'; then
echo "Integer value: $int_value"
else
echo "You specified not integer value: $int_value"
fi
и успокоиться, но спортивный интерес перевесил и я решил разобраться в причине.
Все стало на свои места после прочтения топика на stackoverflow. Оказывается в bash 3.2 поменяли поведение квотинга при сравнении с regex выражениями и теперь квотить не нужно (более того, старый вариант теперь работает неверно). Чтобы вернуть совместимость с кодом на bash 3.1, нужно либо выставить флаг совместимости
compat31, либо исправить код, убрав квотирование#!/bin/bash
int_value=-123
if [[ ! $int_value =~ ^-?[0-9]+$ ]]; then
echo "You specified not integer value: $int_value"
else
echo "Integer value: $int_value"
fi
Если переписывать много кода лень, то можно просто выставить опцию совместимости
#!/bin/bash
setopt compat31
int_value=-123
if [[ ! "$int_value" =~ "^-?[0-9]+$" ]]; then
echo "You specified not integer value: $int_value"
else
echo "Integer value: $int_value"
fi
Комментариев нет:
Отправить комментарий