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:
output=${1-text} echo $output
OR (see my comment below):
output=${1:-text} 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:
#!/bin/bash output=${1-text} 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:
#!/bin/bash output=${1-text} [ $# -eq 0 ] && { echo "Usage: $0 format" ; exit 1; } echo "Setting output to $output..."
You should follow me on twitter here or grab rss feed to keep track of new changes.
Featured Articles:
- 30 Handy Bash Shell Aliases For Linux / Unix / Mac OS X
- Top 30 Nmap Command Examples For Sys/Network Admins
- 25 PHP Security Best Practices For Sys Admins
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins
- Top 20 OpenSSH Server Best Security Practices
- Top 20 Nginx WebServer Best Security Practices
- 20 Examples: Make Sure Unix / Linux Configuration Files Are Free From Syntax Errors
- 15 Greatest Open Source Terminal Applications Of 2012

- My 10 UNIX Command Line Mistakes
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- The Novice Guide To Buying A Linux Laptop













{ 6 comments… read them below or add one }
Wow, this is very helpful. Thanks!
thanks buddy, very useful post..
I didn’t know that we could easily use “output=${1-text}” to test & set a variable in shell..
Thx
B.R
Susinthiran
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’?
@Ronald,
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):
${1:-text}I should have mentioned both syntax..
HTH
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”.