Bash shell scripting: a colon difference

Posted on December 8, 2008

3


Have you ever wonder what the difference between ${name-”Hai Vu”} and ${name:-”Hai Vu”}? In other word, what is the difference does the colon make? To save you all the suspense: the colon works when a variable is either empty or unset. The construct without colon will only work when the variable is unset. To illustrate my point, I have created an example shell script (var_substitution.sh). Please save it to a file, examine, and run it to see my demo.

As always, please use the comment facility to post your questions, suggestions, or comments. I love to hear from you.
Hai

#!/bin/bash

# Demonstrate the subtle difference between ${var-word} and ${var:-word}

clear

printf “\n=================================\n”
printf “\${varName+word} and \${varName:+word} comparison\n\n”

varName=”Aloha”
echo “varName is not empty: the two constructs behave the same”
echo ” \${varName+Hello World}=${varName+Hello World}”
echo ” \${varName:+Hello World}=${varName:+Hello World}”
echo “”

unset varName
echo “varName is unset: they still behave the same way”
echo ” \${varName+Hello World}=${varName+Hello World}”
echo ” \${varName:+Hello World}=${varName:+Hello World}”
echo “”

varName=”"
echo “varName is empty: this is where the two differs”
echo ” \${varName+Hello World}=${varName+Hello World}”
echo ” \${varName:+Hello World}=${varName:+Hello World}”
echo “”

printf “\n=================================\n”
printf “\${varName-word} and \${varName:-word} comparison\n\n”

varName=”Aloha”
echo “varName is not empty: the two constructs behave the same”
echo ” \${varName-Hello World}=${varName-Hello World}”
echo ” \${varName:-Hello World}=${varName:-Hello World}”
echo “”

unset varName
echo “varName is unset: they still behave the same way”
echo ” \${varName-Hello World}=${varName-Hello World}”
echo ” \${varName:-Hello World}=${varName:-Hello World}”
echo “”

varName=”"
echo “varName is empty: this is where the two differs”
echo ” \${varName-Hello World}=${varName-Hello World}”
echo ” \${varName:-Hello World}=${varName:-Hello World}”
echo “”

echo “
=================================
Conclusion
- The colon (:) construct works when a variable is empty AND unset
- The non-colon construct only works when the variable is unset

About these ads
Posted in: Programming, Unix