Восьмеричная разность разностей между [и [[?
Насколько я знал, [[
и [
можно ожидать, что они будут вести себя в основном одинаково, принимая во внимание несколько дополнительных функций [[
. Но недавно я заметил расхождение в том, как 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 делает различие между [[
и [
для восьмеричного расширения целенаправленно или это просто случайная функция?
Ответы
Ответ 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