[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Test existence of shell variable, bash, csh



on Sun, May 06, 2001 at 02:22:40AM +0300, Tommi Komulainen (Tommi.Komulainen@iki.fi) wrote:
> On Sat, May 05, 2001 at 02:34:47PM -0700, Karsten M. Self wrote:
> > 
> > In contrast, csh and derivatives have:
> > 
> >    $?MYVAR
> > 
> > ...which allows testing of presence of a variable.
> > 
> > ...but I'm not aware of a similar bash/korn/bourne feature.  Anyone?
> 
> Coming soon to ./configure scripts near you:
> 
> if test "${LANG+set}" = set; then LANG=C; export LANG; fi

Close, but not quite.  It's probably the nearest thing to a winner I've
seen posted though.  And you just edged out Alan's suggestion of an
equivalent but opposite test.

Note that this is a specific application of the Use Alternate Value bash
parameter expansion.  The value "set" isn't special, though it's a good
mnemonic.

> or in your case:
> 
> if test "${MYVAR+set}" = set; then
>     echo "MYVAR doesn't exist"
> else
>     echo "MYVAR exists, value: $MYVAR"
> fi
> 
> 
> also available in bash(1): 
> 
>        In each of the cases  below,  word  is  subject  to  tilde
>        expansion,  parameter expansion, command substitution, and
>        arithmetic  expansion.   When  not  performing   substring
>        expansion,  bash  tests  for  a parameter that is unset or
>        null; omitting the colon results in  a  test  only  for  a
>        parameter that is unset.
> 
>        ${parameter:+word}
>               Use Alternate  Value.   If  parameter  is  null  or
>               unset, nothing is substituted, otherwise the expan­
>               sion of word is substituted.

The possible problem"  "*null or* unset".  An existing, but null,
environment variable will be reported as unset.

It's possible to create a null environment variable, e.g.:

    $ foo=
    $ echo $foo

    $ echo ${foo:-unset}
    unset
    $ typeset -p foo
    declare -- foo=""
    $ unset foo
    $ typeset -p foo
    bash: typeset: foo: not found
    $ echo $?
    1

...which suggests

    if ! typeset -p myvar 2>/dev/null

...as a test under bash which accurately reports whether or not an
environment variable exists, evaluated or otherwise, rather than merely
has a non-null value.

Note that yet another option would be to access /proc/self/environ to
check for the existence of an environment variable.  Which works under
GNU/Linux but not other Unices.

> Since it is used in configure scripts, I'd guess it's pretty portable.

It does the job.  It may not be optimal.  And, yes, portability is an
issue here.

-- 
Karsten M. Self <kmself@ix.netcom.com>    http://kmself.home.netcom.com/
 What part of "Gestalt" don't you understand?       There is no K5 cabal
  http://gestalt-system.sourceforge.net/         http://www.kuro5hin.org

Attachment: pgplMA9yw6IIp.pgp
Description: PGP signature


Reply to: