33

I have just stumbled upon the bash syntax:

foo=42
bar=$[foo+1] # evaluates an arithmetic expression

When I Googled for this, I found http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html#sect_03_04_05:

3.4.6. Arithmetic expansion

Arithmetic expansion allows the evaluation of an arithmetic expression and the substitution of the result. The format for arithmetic expansion is:

$(( EXPRESSION )) 

...

Wherever possible, Bash users should try to use the syntax with square brackets:

$[ EXPRESSION ] 

However, this will only calculate the result of EXPRESSION, and do no tests...

In my bash man page I can only find the $(( EXPRESSION )) form such as:

foo=42
bar=$((foo+1)) # evaluates an arithmetic expression

So what tests are not performed with $[...] that do with $((...)), or is the $[...] just a legacy version of $((...))?

1

2 Answers 2

41

The manpage for bash v3.2.48 says:

[...] The format for arithmetic expansion is:

     $((expression))

The old format $[expression] is deprecated and will be removed in upcoming versions of bash.

So $[...] is old syntax that should not be used anymore.

Sign up to request clarification or add additional context in comments.

1 Comment

Note that exact text is not in the bash man page, it's in some bash man pages (e.g. Debian patch this). The feature has been deprecated since bash-2.0, but persists today (bash-4.2).
13

@sth is entirely correct. And in case you are curious about why a more verbose syntax is now in favor, check out this old email from the mailing list.

http://lists.gnu.org/archive/html/bug-bash/2012-04/msg00033.html

In early proposals, a form $[expression] was used. It was functionally equivalent to the "$(())" of the current text, but objections were lodged that the 1988 KornShell had already implemented "$(())" and there was no compelling reason to invent yet another syntax. Furthermore, the "$[]" syntax had a minor incompatibility involving the patterns in case statements.

I am not sure that I like the rationale “but someone has already done this more verbosely,” but there you have it—maybe the case-statement problem was more compelling than I am imagining from this obscure mention?

1 Comment

More importantly, $(( )) was standardized by POSIX.2 (published in the early 1990s), and $[ ] was not.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.