Re: about [ and [[ in bash

Elias Gabriel Amaral da Silva <[email protected]>
Newsgroups gmane.linux.newbie
Message-ID <[email protected]>
> Has been a while since I had to ask a question on this list!
>
> I was having trouble understanding how the compound command [[ and the
> builtin [ commands were different from each other and why/when would it be
> better to choose one over the other.

In order to answer your question, I joined #bash at irc.freenode.net
and used [ and [[ command of its bot. (It is used to keep a FAQ about
bash and shell scripting). I could use help [ and help [[ at shell
prompt, but this doesn't provide links for further reading :)

Look:

<dark> [
<greybot> [ is NOT part of the `if' syntax. It's a normal, ordinary
COMMAND. The `if' just checks its exit status. See ''help test'',
http://mywiki.wooledge.org/BashGuide/Practices/BashTests and
http://partmaps.org/era/unix/award-example-backticks.html
<dark> [[
<greybot> [[ is a bash keyword similar to (but more powerful than) the
[ command. See http://mywiki.wooledge.org/BashFAQ/031 and
http://mywiki.wooledge.org/BashGuide/Practices/BashTests Unless you
are scripting for POSIX sh we recommend [[.

[ is from the original unix shell. It's portable between shells, and
acessible if you are using /bin/sh as your shell, for example. It's
equivalent to test, but you have to put a ] in the end. so:

if test -e /; then echo a; fi

is the same as

if [ -e / ]; then echo a; fi

on my system, it's a shell builtin. but here it is available as a
regular program too, at /usr/bin/[, so this has the same result as

if /usr/bin/[ -e / ]; then echo a; fi

this would spawn another process, pass -e, /, ] as parameters, and
watch for the return value: 0 means true, nonzero means false. (if you
know C, the parameters would be inserted in argc/argv arguments of
main, and the return value would be the int it returns). that's how if
works (for non-builtins).

[[ is different from test, and isn't available at all shells. it is
more powerful though. you don't need to quote variables, for example.
some advise that you use [[ when you expect to use bash only (or ksh,
..), and [ if you need a portable shell script.

(ps: also note this is not strictly linux-related: linux works at a
lower level. this was actually a shell question. ^^)

-- 
Elias Gabriel Amaral da Silva <[email protected]>
--
To unsubscribe from this list: send the line "unsubscribe linux-newbie" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.linux-learn.org/faqs
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.