Арифметическое расширение и расширение параметров

У меня тот же процессор, и Openmandriva LX 3 работает нормально, единственная проблема - он слишком медленно запускается (я установил его на жесткий диск SATA).

Я пробовал Manjaro, freya, Mint и Opensuse, и это не сработало. Думаю, проблема в версии ядра, Openmandrive использует 4.6.5.

2
24.04.2016, 22:44
1 ответ

Это расширение bash (а также zsh , ksh и его производные), чтобы переменная оболочки могла содержать недопустимую целочисленную константу для повторного использования в арифметических выражениях.

Из bash Арифметика оболочки :

Переменные оболочки разрешены как операнды; раскрытие параметра выполняется до вычисления выражения. В выражении на переменные оболочки также можно ссылаться по имени без использования синтаксиса раскрытия параметра . Переменная оболочки, имеющая значение NULL или не заданная , оценивается как 0 при ссылке по имени без использования синтаксиса раскрытия параметра . Значение переменной оценивается как арифметическое выражение , когда на нее ссылаются, или когда переменной, которой был присвоен целочисленный атрибут с помощью 'declare -i', назначается {{1} } стоимость. Нулевое значение оценивается как 0. Целочисленный атрибут переменной оболочки не обязательно должен использоваться в выражении.

Итак, в вашем случае $ ((x)) сначала расширил x до foo , что является недопустимым целым числом, поэтому foo повторно используется как ссылка на имя переменной.Затем foo был расширен до bar , процесс повторялся, пока вы не получили 6 , что является действительным целым числом.


В спецификации POSIX указано только, что $ ((x)) и $ (($ x)) вернут одно и то же значение, только если x является допустимая целочисленная константа. Он ничего не говорит о том, что случай x является недопустимым целым числом, поэтому реализации оболочки могут справиться с этой ситуацией.

Результат можно варьировать с разными снарядами.

zsh , ksh и его производные ведут себя как bash выше (а также busybox sh ).

ash , dash вызывают ошибку, если x содержат недопустимое целое число

$ x=foo foo=bar bar=6 dash -c 'echo "$((x))"'
dash: 1: Illegal number: foo

yash оставляет переменную как есть:

$ x=foo foo=bar bar=6 yash -c 'echo "$((x))"'
foo
3
27.01.2020, 22:04

Теги

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