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

In this tutorial, we’ll discuss the differences between ${} and $() in Bash. First, we’ll briefly review how command substitution and parameter expansion work in Bash. Then, we’ll dive into the differences between the two and discuss some use cases.

2. Command Substitution

Command substitution in Bash allows us to execute a command and substitute it with its standard output. Note this command executes within a subshell, which means it has its own environment and so it will not affect the parent shell’s environment.

Let’s now check a way to achieve command substitution:

$ var_date=$(date) && echo $var_date
Sat May  1 11:33:36 IST 2021

In this case, we are using the $(..) form where the command to be executed is enclosed between the parentheses. This form is the recommended syntax of command substitution.

3. Brace Parameter Expansion

Let’s run a couple of examples to understand how parameter expansion works:

$ price=5
$ echo "$priceUSD"

$ echo "${price}USD"
5USD

As we can observe from the output, we use {..} here as a disambiguation mechanism for delimiting tokens.

Adding double quotes around a variable tells Bash to treat it as a single word. Hence, the first echo statement returns an empty output since the variable priceUSD is not defined.

However, using ${price} we were able to resolve the ambiguity. Clearly, in the second echo statement, we could concatenate the string USD  with the value of the price variable that was what we wanted to do.

Another interesting use of brace expansion is to generate arbitrary strings:

$ mkdir /home/shubh/baeldung/{linux,cs,java}
$ ls -lrt /home/shubh/baeldung/
total 0
drwxr-xr-x 1 shubh shubh 512 Mar 28 15:24 linux
drwxr-xr-x 1 shubh shubh 512 Mar 28 15:24 cs
drwxr-xr-x 1 shubh shubh 512 Mar 28 15:24 java

Note how we used the brace expansion to easily create multiple directories at once.

4. Differences

As we’ve seen in the previous sections, we should use $() when we want to capture the command result written to stdout. In such a case, the command, which will be executed in a new sub-shell, has to be specified within the parenthesis.

Using brace parameter expansion, on the other hand, we can specify a variable within {} to protect it against expansion. This is useful when the characters immediately following it can be interpreted as part of the variable name.

Let’s now verify those concepts using an example:

$ due_date="01-01"
$ echo "Status as of $(date +%m-%d-%Y) : The delivery is due on ${due_date}-2022"
Status as of 05-01-2021 : The delivery is due on 01-01-2022

In this example, we’re using the ${} form, i.e., brace expansion, to print the value of the due_date variable. Also, we are using the command substitution $()  to execute the date command print the current date.

5. Conclusion

In this article, we’ve learned the difference between the use of ${} and $() in Bash. First, we briefly reviewed the concepts of command substitution and parameter expansion. Finally, we discussed the differences along with some use-cases for the ${} and $() syntax.