Расширение параметра отличается от арифметического вычисления .
В арифметическом выражении текстовая строка, такая как a
, интерпретируется как имя переменной, а значение этой переменной обрабатывается как само арифметическое выражение, а результат используется в содержащем арифметическом выражении. Таким образом
$((a * 3))
приводит к тому, что значение переменной a
, 1+1
вычисляется как арифметическое выражение, в результате чего получается 2
, и все выражение становится $((2 * 3))
, , т. е.6
.
В том же контексте,$a
заменяется значением a
, так как -на более ранней стадии(это является расширением параметра ); так
$(($a * 3))
становится $((1+1 * 3))
, то есть 4
следует обычным правилам приоритета.
Во втором примере $((++a))
обрабатывается до обработки$b
(слева направо ). Арифметическое выражение приводит к тому, что a
оценивается как само арифметическое выражение, как указано выше; значение a
равно a=b++
, которое при вычислении присваивает значение b
(, вычисленное как арифметическое выражение ), в a
, а затем увеличивает b
. Таким образом, после вычисления a
, b
равно 2
, а a
равно 1
. Вычисление $((++a))
увеличивает a
и возвращает его значение, которое теперь равно 2
. $b
просто заменяется значением b
, 2
. После того, как аргумент echo
в кавычках обработан, echo
запускается с 2 2
в качестве единственного аргумента, создавая результат, который вы видели.
Для этого есть блестящая программа:https://github.com/PeterCxy/evdev-right-click-emulation
Не знаю, как я это пропустил, но он отлично работает и на других DE.