Подтвердить что ты не робот

Shell Script Ошибка: слишком большое значение для базы (маркер ошибки равен "08" )

Здесь моя проблема заключается в том, чтобы найти разницу в использовании одиночной скобки [] и двойных скобок [[]] в инструкции if.

#!/bin/bash
vara=08;
varb=10;

## single bracket in if statment is working.
if [ $vara -lt $varb ]; then
echo "yes";
else
echo "no";
fi


## double brackets in if statment is not working; throwing an error like below.
## [[: 08: value too great for base (error token is "08")
if [[ $vara -lt $varb ]]; then
echo "yes";
else
echo "no";
fi
4b9b3361

Ответ 1

Оболочка пытается интерпретировать 08 как восьмеричное число, поскольку оно начинается с нуля. Однако только цифры 0-7 допускаются в восьмеричном формате, так как десятичное число 8 равно восьмеричному 010. Следовательно, 08 не является допустимым числом и причина ошибки.

Отдельные скобки - это "режим совместимости" с sh, а sh не знает о восьмеричных числах.

Итак, если вы используете одиночные квадратные скобки, "010" будет интерпретироваться как 10, а с двойными квадратными скобками "010" будет интерпретироваться как 8.

Если вы используете одиночные квадратные скобки, "08" будет интерпретироваться как 8, а с двойными квадратными скобками - это недопустимое число и приведет к ошибке.

Вы можете избежать ошибки, используя описанное здесь решение: fooobar.com/info/182351/...

if [[ ${vara#0} -lt ${varb#0} ]]

или

if [[ $((10#$vara)) -lt $((10#$varb)) ]]