2013-09-09 5 views
42

В чем разница между присвоением переменной, например var=foo, и использованием let let var=foo? Или такие случаи, как var=${var}bar и let var+=bar? Каковы преимущества и недостатки каждого подхода?Bash: let statement vs assign

ответ

47

let делает именно то, что (()) do, это для арифметических выражений. Существует almost no difference между let и (()).

Недопустимые примеры. var=${var}bar собирается добавить слово bar переменной var (который является операцией строка), let var+=bar не будет работать, потому что это не арифметическое выражение:

$ var='5'; let var+=bar; echo "$var" 
5 

На самом деле, это арифметическое выражение, если была установлена ​​только переменная bar, в противном случае bar обрабатывается как ноль.

$ var='5'; bar=2; let var+=bar; echo "$var" 
7 
+0

Одно отличие состоит в том, что 'let' допускает некоторую степень косвенности:' a = b; б = 3; пусть $ a + = 1; echo $ b; '. Аргумент 'let' подвергается расширению параметров перед оценкой (что, я думаю, я не видел в упомянутой ссылке). – chepner

+4

Собственно, царапины это. Я думал, что после 'a = b; b = 3', две команды '((a + = 1))' и '(($ a + = 1))' будут эквивалентны, но это не так. Первое, похоже, заменяет 'a' значением' b', затем увеличивает, оставляя значение 'b' нетронутым. Второй приращает 'b', оставляя' a' установленным в строке 'b'. – chepner