≡ Menu

Shell Scripting: If Variable Is Not Defined, Set Default Variable

If var is defined AND NOT EMPTY, use var, otherwise set a default variable under Bash. For e.g. my script needs a parameter for output variable. It can be text or html. I set it as follows in my script

output=$1 # either text or html

However, sometime user forget to pass the parameter to my shell script and my enter logic fails. So how do I set default value to text, if no parameter passed?

BASH, POSIX shell, and Korn (all versions) support the parameter expansion and testing. For e.g. if $1 is defined AND NOT EMPTY, use $1; otherwise, set to “text”, enter:

echo $output

OR (see my comment below):

echo $output

Try another example at a shell prompt:
$ vech=Bus
$ echo ${vech-Car}
$ echo ${vech:-Car}
$ unset vech
$ echo ${vech-Car}
$ echo ${vech:-Car}

Finally, here is a sample script:

echo "Setting output to $output..."

Now, run it as follows:
$ ./script.sh html
$ ./script.sh text
$ ./script.sh

You can also force to user to pass the parameter:

[ $# -eq 0 ] && { echo "Usage: $0 format" ; exit 1; }
echo "Setting output to $output..."
Share this tutorial on:

Your support makes a big difference:
I have a small favor to ask. More people are reading the nixCraft. Many of you block advertising which is your right, and advertising revenues are not sufficient to cover my operating costs. So you can see why I need to ask for your help. The nixCraft, takes a lot of my time and hard work to produce. If you use nixCraft, who likes it, helps me with donations:
Become a Supporter →    Make a contribution via Paypal/Bitcoin →   

Don't Miss Any Linux and Unix Tips

Get nixCraft in your inbox. It's free:

{ 8 comments… add one }
  • Chris July 25, 2009, 1:15 pm

    Wow, this is very helpful. Thanks!

  • Rahul Sonar July 26, 2009, 3:45 pm

    thanks buddy, very useful post..

  • Susinthiran July 27, 2009, 6:59 am

    I didn’t know that we could easily use “output=${1-text}” to test & set a variable in shell..


  • Ronald Fischer July 27, 2009, 7:11 am

    It surprises me that this works (and, at least, on bash 3, it does). I have always used the form
    ${VAR:-VALUE} in such a case, not ${VAR-VALUE}, but it seems that both work. The man pages of bash describe, however, ONLY the variant with a colon, so I wonder whether omitting the colon just exploits an undocumented feature, which might be gone with the next version of bash. Or did I miss here something in ‘man bash’?

  • nixCraft July 27, 2009, 7:59 am


    The original Bourne shell only supported above syntax and it works with all shells to keep portability. POSIX shells (KSH and BASH) offer a slight variant (as mentioned in bash man page):


    I should have mentioned both syntax..


  • Shantanu Oak July 27, 2009, 12:32 pm

    I do completely agree with what Ronald has said. I strongly recommend using : – because it is more logical. A lot of people will like it since they are looking for equivalent of If – Then – Else logic and in this case : stands for “then” and – for “else”.

  • Jeff June 4, 2015, 4:03 am

    Thanks for the post! Found via Google and helped me out. There is apparently a difference between using the dash and using the dash with the colon. This page explains it quite well: http://www.tldp.org/LDP/abs/html/parameter-substitution.html

    Brief intro to when they differ:
    “${parameter-default} and ${parameter:-default} are almost equivalent. The extra : makes a difference only when parameter has been declared, but is null.”

  • Sadashiv July 30, 2015, 6:40 am

    Thanks a lot, Helped me to modify my script very less with this post.


Leave a Comment

You can use these HTML tags and attributes: <strong> <em> <pre> <code> <a href="" title="">

   Tagged with: , , , , , , , , , , , ,