Black Friday 2025 – NPI EA (cat = Baeldung on Linux)
announcement - icon

Yes, we're now running our Black Friday Sale. All Access and Pro are 33% off until 2nd December, 2025:

>> EXPLORE ACCESS NOW

Baeldung Pro – Linux – NPI EA (cat = Baeldung on Linux)
announcement - icon

Learn through the super-clean Baeldung Pro experience:

>> Membership and Baeldung Pro.

No ads, dark-mode and 6 months free of IntelliJ Idea Ultimate to start with.

Partner – Orkes – NPI EA (tag=Kubernetes)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

1. Overview

When dealing with variables in shell scripting, it’s important to account for the fact that a variable may have one of several states:

Thus, to avoid unexpected errors, we can use the ${param:-param} expression along with similar expressions to assign a default value to a variable under specific conditions.

In this tutorial, we’ll explore how to assign a default value to a variable using ${param:-param} and similar expressions. To test our methods, we’ll use the echo command along with basic shell variable assignments.

2. Parameter Expansion of ${param:-param}

If a variable, x, is unset or is the null string, then ${x:-default_value} expands to the default_value string. Importantly, no assignment to the x variable takes place, and the variable retains its original value.

2.1. Non-null

To test the expression, let’s start with the case when x takes on a non-null value:

$ x=value
$ echo "${x:-default_value}"
value

Since x is set and isn’t the null string, the parameter expansion of ${x:-default_value} returns the value of x.

2.2. Null and Unset

Next, let’s consider the case when we set x to the null string:

$ x=''
$ echo "${x:-default_value}"
default_value

In this case, the expression expands to the default_value string shown on the right-hand side of the :- syntax.

Finally, let’s consider the case when x is unset:

$ unset x
$ echo "${x:-default_value}"
default_value

Here, the ${x:-default_value} expression expands to the default_value string since x is unset. The x variable remains unset and no assignment takes place.

2.3. Assign to Variable

Notably, however, we can assign the result of the entire expression to another variable:

$ y="${x:-default_value}"
$ echo "$y"
default_value

The y variable is assigned the result of the ${x:-default_value} expression which, in this case, expands to the default_value string since x is unset.

2.4. Variable Values

Moreover, the right-hand side of the ${param:-param} expression can represent the value of some other variable, say z:

$ z=0
$ echo "${x:-$z}"
0

Here, the expression expands to the value of the z variable since x is unset.

2.5. Substring Expansion Modifications

Notably, the ${param:-param} syntax differs from that of substring expansion:

$ x='string'
$ echo "${x: -4}"
ring
$ echo "${x:(-4)}"
ring

In this case, we extract a substring from the x variable starting at index 4, counting from the end. To distinguish the negative indexing used in variable subsetting from the ${param:-param} expression, we either introduce a space between the colon and the negative sign, or place the negative index within parentheses.

3. Parameter Expansion of ${param-param}

If a variable, x, is unset, then ${x-default_value} expands to the default_value string. Importantly, no assignment to the x variable takes place, and the variable retains its original value.

The difference between this scenario and the one from earlier is that when x is set to the null string, the expression doesn’t expand to the default_value string.

3.1. Non-null and Null

Let’s test the expression beginning with the case when x assumes a non-null value:

$ x=value
$ echo "${x-default_value}"
value

We see that the expression expands to the value of the x variable since the variable is set.

If x is the null string, the ${x-default_value} expression also expands to the value of x:

$ x=''
$ echo "${x-default_value}"

$

Now, let’s see what happens in the third case.

3.2. Unset

However, when x is unset, the expression expands to the default_value string provided in the right-hand side:

$ unset x
$ echo "${x-default_value}"
default_value

Notably, no assignment occurs, and the x variable remains unset. Of course, we can also substitute the constant string with a variable.

4. Parameter Expansion of ${param:=param}

The expansion of ${param:=param} is very similar to that of ${param:-param} with one difference: variable assignment occurs in this case, specifically when the variable is unset or is the null string.

4.1. Non-null

Let’s test the expression when x takes on a non-null value:

$ x=value
$ echo "${x:=default_value}"
value

The expression expands to the value of x as expected. No variable assignment takes place in this case, and x retains its original value.

4.2. Null and Unset

However, when x is the null string, the ${x:=default_value} expression assigns the default_value string to x, and the expression expands to the new value:

$ x=''
$ echo "${x:=default_value}"
default_value
$ echo "$x"
default_value

We see that both, the x variable and the expression, expand to the default_value string.

Likewise, if x is unset, we obtain the same result as with the null string case. Therefore, the default_value string assigns to x, and the expression expands to the new value of x:

$ unset x
$ echo "${x:=default_value}"
default_value
$ echo "$x"
default_value

We see that the expression triggers variable assignment in this case, and both x and the ${x:=default_value} expression expand to the default_value string.

5. Parameter Expansion of ${param=param}

The expansion of the ${param=param} expression is very similar to that of ${param-param} with one difference: variable assignment occurs in this case, specifically when the variable is unset.

5.1. Non-null and Null

If we set x to a non-null value, the ${x=default_value} expression expands to the value of x, and no new assignment takes place:

$ x=value
$ echo "${x=default_value}"
value

Similarly, if we set x to the null string, the ${x=default_value} expression expands to the value of x, which is the null string, and no assignment takes place:

$ x=''
$ echo "${x=default_value}"

$

Now, let’s see what happens when x isn’t set.

5.2. Unset

Finally, if we unset x, then ${x=default_value} assigns the default_value string to x, and the expression expands to the newly assigned value:

$ unset x
$ echo "${x=default_value}"
default_value
$ echo "$x"
default_value

In this case, the interpreter assigns x the default_value string.

6. Tabular Summary

We can summarize the parameter expansion results for the different expressions in a table:

Expression x is set and isn’t null x is set to the null string x is unset
${x:-default_value} $x default_value default_value
${x-default_value} $x $x (null string) default_value
${x:=default_value} $x default_value default_value
${x=default_value} $x $x (null string) default_value

 

 

 

 

 

Importantly, an assignment to variable x only occurs in the cases of ${x:=default_value} and ${x=default_value}.

7. Conclusion

In this article, we explored how to set a default value to a variable under various conditions using the ${param:-param} expression and similar constructs. In particular, the conditions involved cases when a variable takes on a non-null value, the null string, or becomes unset.