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.

Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.