As we mentioned in Variables - Part I, curly brackets around a variable avoid confusion:
foo=sun echo $fooshine # $fooshine is undefined echo ${foo}shine # displays the word "sunshine"That's not all, though - these fancy brackets have a another, much more powerful use. We can deal with issues of variables being undefined or null (in the shell, there's not much difference between undefined and null).
Using Default Values
Consider the following code snippet which prompts the user for input, but accepts defaults:#!/bin/sh echo -en "What is your name [ `whoami` ] " read myname if [ -z "$myname" ]; then myname=`whoami` fi echo "Your name is : $myname"The "-en" to echo tells it not to add a linebreak. On some systems, you use a "\c" at the end of the line, instead.
This script runs like this:
steve$ ./name.sh What is your name [ steve ] Your name is : steve ... or, with user input: steve$ ./name.sh What is your name [ steve ] foo Your name is : fooThis could be done better using a shell variable feature. By using curlybraces and the special ":-" usage, you can specify a default value to useif the variable is unset:
echo -en "What is your name [ `whoami` ] " read myname echo "Your name is : ${myname:-`whoami`}"This could be considered a special case - we're using the output of thewhoami command, which prints your login name (UID). The more canonicalexample is to use fixed text, like this:
echo "Your name is : ${myname:-John Doe}"As with other use of the backticks,
`whoami`
runs in a subshell, so any
cd
commands, or setting any other variables, within the backticks, will not affect the currently-running shell.
Using and Setting Default Values
There is another syntax, ":=", which sets the variable to the defaultif it is undefined:echo "Your name is : ${myname:=John Doe}"This technique means that any subsequent access to the
$myname
variable will always get a value, either entered by the user, or "John Doe" otherwise.