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

Восьмеричная разность разностей между [и [[?

Насколько я знал, [[ и [ можно ожидать, что они будут вести себя в основном одинаково, принимая во внимание несколько дополнительных функций [[. Но недавно я заметил расхождение в том, как bash обрабатывает восьмеричные разложения:

$ b=010; echo $((b))
8
$ [[ $b -eq 8 ]]; echo $?
0

но

$ [ $b -eq 8 ]; echo $?
1
$ test $b -eq 8; echo $?
1
$ [ $b -eq 10 ]; echo $?
0

Почему последнее выражение удаляет автоматическое октальное преобразование? Выражения типа -eq являются "Арифметическими" в соответствии с help test в bash и справочном руководстве Bash и далее в соответствии с следующим разделом ссылки Ручные константы с начальным нулем можно рассматривать как восьмеричные.

POSIX sh немного менее понятен по теме: Несмотря на то, что арифметические выражения POSIX по-прежнему расширяют целые числа целых чисел до их восьмеричного значения, это относится к -eq выражения в test как алгебраические, а не арифметические.

Есть ли какая-либо документация или доказательства, указывающие на то, что bash делает различие между [[ и [ для восьмеричного расширения целенаправленно или это просто случайная функция?

4b9b3361

Ответ 1

[[известен как расширенная тестовая команда и ведет себя как ksh88, вы можете найти здесь проработку: http://tldp.org/LDP/abs/html/testconstructs.html#DBLBRACKETS

Также, если вам нужно быть уверенным в базе в bash, вы можете использовать # базовый оператор следующим образом:

b=010; echo $((10#$b))
10
b=10; echo $((8#$b)
8
b=013; echo $((8#$b))
11