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 [#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....