2015-10-21 9 views
0

От this tutorial Я смотрел на самом первом примере, и не могу понять, почему b будет установлен 2Понимание «пусть» команда

$ let 'b = a' "(a += 3) + $((a = 1)), b++" 
$ echo "$a - $b - $?" 
4 - 2 - 0 

Из моего понимания, let оценивает команды слева правильно. Таким образом, b=a оценивается, но так как a пустым на первый, это имеет значение 0, который я тестировал с

$ let 'b=a' 
$ echo $b 
0 

Далее, a += 3, что, поскольку a является пустым, вычисляется в 3, но тогда мы добавьте $((a = 1)), который мне кажется установленным a назад к 1. Наконец, мы добавляем 1 в b. Я ожидаю, что выход будет 1 - 1 - 0. Однако, поскольку вывод 4 - 2 - 0, мне кажется, что $((a = 1)) - это первый выполненный оператор. Может кто-нибудь объяснить, почему это так?

ответ

1

bash анализирует приведенные аргументы перед их передачей команде. В этом случае раздел $() оценивается во время этого начального анализа. Значение a устанавливается в 1, и весь раздел замещено 1. Так let видит:

b = a (a += 3) + 1, b++ 

и является уже 1 до того, что выполняет.

0

В вашем учебнике указывается Remember that inside arithmetic evaluation contexts, all other expansions are processed as usual (from left-to-right), and the resulting text is evaluated as an arithmetic expression..
Итак, сначала все расширения расширения (подоболочки с $(something)) обрабатываются, прежде чем результирующий текст будет оценен как арифметическое выражение.