Re: if [[ $Something ]] – in what situations does this work?

Robert P. J. Day rpjday at crashcourse.ca
Sat Feb 18 17:33:44 UTC 2012


On Sat, 18 Feb 2012, franz.reitinger wrote:

> ...
> > just confuse bash scripting with other things, such as C and even
> > Basic:
> > if (x) {
> > 	dostuff;
> > 	domorestuff;
> > }
> >
> > or
> >
> > if x then
> > 	dostuff
> > 	domorestuff
> > endif
> >
> >
>
> In programming languages ​​like C a return value of 0 means that an
> error has occurred.
> e.g.
> if ( expr ) { // expr <> 0 ==> TRUE
>     ...
> } else ...
>
> A script executed within a bash shell works contrariwise;
> e.g.
> if [ expr ]; # you have to check the expression (expr == 0) and this
> evalutes to TRUE/FALSE
>
> Unix based apps return a 0 for success and a value <> 0 is used for
> returning the error code.
> In C (and other programming languages) a return value of 0 evalutes to
> FALSE; all other values evaluate to TRUE

  let me throw in a bit of info that might clear up a lot of
confusion.  one of the forms of the "if" construct in shell
programming is:

  if <some command> ; then

where you're testing the exit code ($?) of some command you're
running.  linux commands normally return 0 if they work, and the "if"
construct treats that value as "true".  (the above is normally called
a "command test" in shell programming.)

  there are four general tests in shell programming:

  1) string tests
  2) numeric tests
  3) file tests
  4) command tests

but (and this is important), they are ***all*** just variations of
command tests.  ***all*** of them.  in every single case, you should
interpret the "if" construct as operating on the result being returned
as if a command had just been run.

  this confuses people who look at something like:

  if [ $VAR = "rday' ] ; then

and think it's a string comparison.  well, ok, it is, but more
fundamentally, it's the *command*

  [ $VAR = "rday" ]

being executed, then returning the appropriate value of $?

  that '[' thing?  it's not just a bracket.  it's a command:

$ type [
[ is a shell builtin
$

  it is (for the most part) precisely equivalent to forms you might
have seen in older shell programs:

  if test $VAR = "rday" ; then

the '[' object is simply another form of the "test" command.  is all
this making sense?

  one last time -- every usage of "if" in a shell script can be
thought of as a command test.

rday


========================================================================
Robert P. J. Day                                 Ottawa, Ontario, CANADA
                        http://crashcourse.ca

Twitter:                                       http://twitter.com/rpjday
LinkedIn:                               http://ca.linkedin.com/in/rpjday
========================================================================


More information about the ubuntu-users mailing list