A coworker claimed recently in a code review that the [[ ]] construct is to be preferred over [ ] in constructs like
if [ "`id -nu`" = "$someuser" ] ; then echo "I love you madly, $someuser" fi
He couldn’t provide a rationale. Is there one?
[[has fewer surprises and is generally safer to use. But it is not portable – POSIX doesn’t specify what it does and only some shells support it (beside bash, I heard ksh supports it too). For example, you can doto test whether a file exists. But with
[, you have to quote$b, because it splits the argument and expands things like'a*'(where[[takes it literally). That has also to do with how[can be an external program and receives its argument just normally like every other program (although it can also be a builtin, but then it still has not this special handling).[[also has some other nice features, like regular expression matching with=~along with operators like they are known in C-like languages. Here is a good page about it: What is the difference between test,[and[[? and Bash Tests