# Differences

This shows you the differences between two versions of the page.

 commands:builtin:let [2012/11/03 08:34]techlivezheng [Examples] commands:builtin:let [2015/11/16 04:19]thebonsai [The let builtin] Both sides previous revision Previous revision 2015/11/16 04:19 thebonsai [The let builtin] 2013/02/21 06:59 ormaaj [Portability considerations] 2012/11/03 08:34 techlivezheng [Examples] 2012/08/11 18:19 ormaaj Point to eval for the weird parsing. rm some not-so-relevant examples.2012/05/03 16:52 ormaaj Finally discovered something useful that can be done with let2012/04/10 23:52 ormaaj (( is preferred.2012/04/10 23:31 ormaaj [Examples] Apparently people still have trouble with this. (nested arithmetic expansion)2011/12/14 07:28 ormaaj Fix errors. Add examples. Add note about expr(1). let "exp" and (( exp )) can differ. e.g. let "4 + \$@" vs (( 4 + \$@ ))2011/06/20 19:52 thebonsai [Portability considerations] 2011/01/13 17:39 thebonsai fixed internal link 2010/09/29 21:19 external edit Next revision Previous revision 2015/11/16 04:19 thebonsai [The let builtin] 2013/02/21 06:59 ormaaj [Portability considerations] 2012/11/03 08:34 techlivezheng [Examples] 2012/08/11 18:19 ormaaj Point to eval for the weird parsing. rm some not-so-relevant examples.2012/05/03 16:52 ormaaj Finally discovered something useful that can be done with let2012/04/10 23:52 ormaaj (( is preferred.2012/04/10 23:31 ormaaj [Examples] Apparently people still have trouble with this. (nested arithmetic expansion)2011/12/14 07:28 ormaaj Fix errors. Add examples. Add note about expr(1). let "exp" and (( exp )) can differ. e.g. let "4 + \$@" vs (( 4 + \$@ ))2011/06/20 19:52 thebonsai [Portability considerations] 2011/01/13 17:39 thebonsai fixed internal link 2010/09/29 21:19 external edit Line 1: Line 1: - ====== The let builtin ====== + ====== The let builtin ​command ​====== ===== Synopsis ===== ===== Synopsis ===== Line 50: Line 50: ===== Portability considerations ===== ===== Portability considerations ===== - * the ''​let''​ command is not specified by POSIX(r). The portable alternative is: <​code>​[ "\$(( <​EXPRESSION>​ ))" -ne 0 ]​ + * the ''​let''​ command is not specified by POSIX(r). The portable alternative is: <​code>​[ "\$(( <​EXPRESSION>​ ))" -ne 0 ]. To make portable scripts simpler and cleaner, ''​let''​ can be defined as: + # POSIX + let() { + IFS=, command eval test '​\$((\$*))'​ -ne 0 + } + ​ Aside from differences in supported arithmetic features, this should be identical to the Bash/Ksh ''​let''​. + * It seems to be a common misunderstanding that ''​let''​ has some legacy purpose. Both ''​let''​ and [[syntax/​ccmd/​arithmetic_eval | ((...))]] were ksh88 features and almost identical in terms of portability as everything that inherited one also tended to get the other. Don't choose ''​let''​ over ''​((''​ expecting it to work in more places. * [[http://​pubs.opengroup.org/​onlinepubs/​9699919799/​utilities/​expr.html#​tag_20_42 | expr(1)]] is a command one is likely to come across sooner or later. While it is more "​standard"​ than ''​let'',​ the above should always be preferred. Both [[syntax:​arith_expr | arithmetic expansion]]s and the ''​[''​ test operator are specified by POSIX(r) and satisfy almost all of expr's use-cases. Unlike ''​let'',​ ''​expr''​ cannot assign directly to bash variables but instead returns a result on stdout. ''​expr''​ takes each operator it recognizes as a separate word and then concatenates them into a single expression that's evaluated according to it's own rules (which differ from shell arithmetic). ''​let''​ parses each word it recieves on its own and evaluates it as an expression without generating any output other than a return code. * [[http://​pubs.opengroup.org/​onlinepubs/​9699919799/​utilities/​expr.html#​tag_20_42 | expr(1)]] is a command one is likely to come across sooner or later. While it is more "​standard"​ than ''​let'',​ the above should always be preferred. Both [[syntax:​arith_expr | arithmetic expansion]]s and the ''​[''​ test operator are specified by POSIX(r) and satisfy almost all of expr's use-cases. Unlike ''​let'',​ ''​expr''​ cannot assign directly to bash variables but instead returns a result on stdout. ''​expr''​ takes each operator it recognizes as a separate word and then concatenates them into a single expression that's evaluated according to it's own rules (which differ from shell arithmetic). ''​let''​ parses each word it recieves on its own and evaluates it as an expression without generating any output other than a return code. - * For unknown reasons, ''​let''​ is one of the Bash commands with special parsing for arguments formatted like compound array assignments. See: [[commands/​builtin/​eval#​portability_considerations | eval]] for details. There are no known practical uses for this. Parentheses are treated as grouping operators and compound assignment is not possible by arithmetic expressions. * For unknown reasons, ''​let''​ is one of the Bash commands with special parsing for arguments formatted like compound array assignments. See: [[commands/​builtin/​eval#​portability_considerations | eval]] for details. There are no known practical uses for this. Parentheses are treated as grouping operators and compound assignment is not possible by arithmetic expressions.