Differences between revisions 3 and 4
Revision 3 as of 2007-07-31 19:42:19
Size: 1796
Editor: GreyCat
Comment: expand to cover "Determine whether a variable is defined"
Revision 4 as of 2007-11-30 03:11:59
Size: 1804
Editor: GreyCat
Comment: change internal link
Deletions are marked like this. Additions are marked like this.
Line 15: Line 15:
If you need to distinguish between a variable that is ''undefined'' and one that is ''defined but empty'', then it becomes much trickier. There is no explicit shell command to test for existence of a variable, but there are some [#faq73 parameter expansion] tricks that can be used. Here is the simplest: If you need to distinguish between a variable that is ''undefined'' and one that is ''defined but empty'', then it becomes much trickier. There is no explicit shell command to test for existence of a variable, but there are some [:BashFAQ#faq73:parameter expansion] tricks that can be used. Here is the simplest:

Anchor(faq83)

How do I determine whether a variable is already defined? Or a function?

There are several ways to determine whether a variable is defined to have a non-empty value. Here are the most common ones, in order from most portable to least portable:

if test -n "$var"
if [ -n "$var" ]
if test "$var"
if [ "$var" ]
if [[ -n $var ]]
if [[ $var ]]

If you need to distinguish between a variable that is undefined and one that is defined but empty, then it becomes much trickier. There is no explicit shell command to test for existence of a variable, but there are some [:BashFAQ#faq73:parameter expansion] tricks that can be used. Here is the simplest:

if [[ ${foo+defined} ]]
# This expansion results in nothing if foo is undefined.  Therefore [[ returns false.
# If foo is defined (to either "" or something longer), the expansion returns "defined",
# and therefore [[ returns true.
# You could use any non-empty string in place of "defined", but readability is nice.

For determining whether a function with a given name is already defined, there are several answers, all of which require Bash (or at least, non-Bourne) commands:

# These two are best:
if [[ $(declare -f foo) ]]     # it prints nothing, if undefined
if declare -f foo >/dev/null   # it also sets the exit status

# These are a little more obvious, but...
if [[ $(type foo 2>&1) = *\ is\ a\ function* ]]
if type foo >/dev/null 2>&1 && ! type -f foo >/dev/null 2>&1

A related question is, Why on earth does anyone want this? Why not just define the function already?

I don't know. I think it has something to do with [http://en.wikipedia.org/wiki/Reflection_%28computer_science%29 reflection]. But people keep asking it, so....

BashFAQ/083 (last edited 2022-11-26 06:06:57 by emanuele6)