If you use Linux or work with scripts, you might have heard about Bash command substitution. At first, it may sound complex, but it is a simple and powerful tool. It allows you to run one command inside another and use the output instantly. This detailed guide will help you understand it and apply it in real scenarios.

Table of Contents

Discover more

Scripting language

BASH

ostechnix

scripts

Shell

Linux

bash

OSTechNix

Unix

Scripting

What is Command Substitution?

Discover more

SHELL

shell

Ostechnix

scripts

scripting

Scripting

Scripting language

Linux

ostechnix

bash

Command substitution in bash is a powerful feature that lets you capture the output of one command and use it as input for another command or assign it to a variable.

To put this in simple words, Command substitution lets you take the output of a command and insert it into another command. Think of it as a way to "plug in" the result of one command into another.

Two Ways to Do Command Substitution

There are two syntaxes for command substitution:

  1. Backticks (older style)`command`
  2. Dollar-parentheses (modern style)$(command)

The $(command) syntax is generally preferred because it's more readable and can be nested easily.

Discover more

Scripting language

shell

BASH

Bash

OSTechNix

Unix

scripts

Linux

scripting

Scripting

Basic Usage

In Bash, the modern and recommended syntax is:

$(command)

For example:

echo "Today is $(date)"

Here, date runs first, and its output replaces $(date). If today is September 3, 2025, the command prints:

Discover more

shell

SHELL

ostechnix

scripts

OSTechNix

Bash

scripting

BASH

Linux

Shells

Today is Wednesday 03 September 2025 03:07:19 PM IST

You can also use the older backtick syntax:

echo "Today is `date`"

However, $(...) is easier to read and allows nested commands, which backticks struggle with.

Benefits of Command Substitution in Bash

Command substitution has three main benefits:

  1. Automation – You don’t need to hardcode values.
  2. Dynamic scripts – Your scripts adapt automatically to system changes.
  3. Cleaner code – You avoid temporary files and extra steps.

For instance, instead of typing a username manually, you can write:

Discover more

OSTechNix

Shell

BASH

Unix

Scripting language

Linux

Ostechnix

bash

scripts

shell

echo "Logged in as $(whoami)"

This prints your username automatically.

Sample Output:

Logged in as ostechnix

Practical Examples of Command Substitution

Here are some common uses you can apply immediately:

Discover more

Scripting

Shells

Ostechnix

scripting

Unix

scripts

SHELL

Scripting language

Shell

Linux

1. Embed Dates in Filenames

You can assign a command's output to a variable and then get the output from that variable like below:

filename="backup-$(date +%F).tar.gz"
echo $filename

Sample Output:

backup-2025-09-03.tar.gz

Discover more

Unix

Shells

shell

scripting

BASH

OSTechNix

Bash

Ostechnix

bash

Linux

This is perfect for daily backups.

Here's another example:

current_date=$(date)
echo "Today is: $current_date"

Sample Output:

Today is: Wednesday 03 September 2025 04:21:50 PM IST

Discover more

Linux

Shells

OSTechNix

Bash

bash

shell

BASH

scripts

ostechnix

Shell

2. Detect System Information

Here's an example with multiple command substitutions:

echo "OS: $(uname -s), Kernel: $(uname -r), Arch: $(uname -m)"

Sample Output:

OS: Linux, Kernel: 6.14.8-2-bpo12-pve, Arch: x86_64

This helps in scripts that need system details.

Discover more

Scripting language

BASH

scripts

Unix

Scripting

Shell

Bash

Shells

scripting

OSTechNix

3. Fetch Latest Versions Dynamically

latest=$(curl -s https://api.github.com/repos/docker/compose/releases/latest | grep tag_name | cut -d '"' -f4)
echo "Latest Docker Compose version: $latest"

Sample Output:

Latest Docker Compose version: v2.39.2

This technique prevents hardcoding version numbers.

Discover more

bash

Shell

BASH

OSTechNix

Scripting

scripting

Linux

Ostechnix

Unix

ostechnix

4. Find Number of Files in the current Directory

Go to a directory in which you want to quickly list the number of files in it and run:

echo "There are $(ls | wc -l) files in this directory"

Sample Output:

There are 8 files in this directory

5. Nesting Commands

You can run commands inside other commands:

echo "Today is $(echo $(date +%A))"

Sample Output:

Today is Wednesday

Nesting increases flexibility and power.

6. File Operations

Backup a file with timestamp:

cp myfile.txt myfile_$(date +%Y%m%d).txt

Count files with specific extension:

echo "You have $(find . -name "*.txt" | wc -l) text files"

7. Conditional Operations

Check disk space:

if [ $(df / | tail -1 | awk '{print $5}' | sed 's/%//') -gt 90 ]; then
    echo "Disk space is running low!"
fi

8. Loop through Command Output

Process each file:

for file in $(ls *.log); do
    echo "Processing $file"
    # do something with $file
done

Best Practices for Command Substitution

1. Always use $(...) instead of backticks. It is clearer and supports nesting.

# This works with $() but would be messy with backticks
result=$(echo "Today is $(date +%A)")

2. Whitespace handling

Command substitution removes trailing newlines and converts internal newlines to spaces:

# If 'ls' outputs multiple lines, they become space-separated
files=$(ls)
echo $files  # Shows files separated by spaces

3. Quote your substitutions if the output contains spaces:

name="$(whoami)"

4. Use variables to make scripts more readable:

os=$(uname -s)
arch=$(uname -m)
echo "OS: $os, Arch: $arch"

5. Combine with pipes to process data dynamically:

echo "Top 5 processes: $(ps aux | sort -nrk 3,3 | head -5)"

Common Mistakes to Avoid

  1. Using backticks for nested commands - it becomes unreadable.
  2. Using backticks instead of $() for new scripts
  3. Forgetting quotes when spaces are involved
  4. Overcomplicating one-liners - break them into steps for clarity.
  5. Assuming stderr output works - only stdout is captured.
  6. Not handling empty results - always check if the command actually returned something
  7. Performance concerns - each substitution spawns a subshell, so don't overuse in loops

Mini Exercises to Practice

1. Print username, home directory, and shell:

echo "User: $(whoami), Home: $(pwd), Shell: $SHELL"

2. Create a dynamic daily backup filename:

filename="backup-$(date +%F).tar.gz"
echo $filename

3. Show OS, kernel version, and architecture:

echo "OS: $(uname -s) | Kernel: $(uname -r) | Arch: $(uname -m)"

Frequently Asked Questions (FAQs)

Q: What is command substitution in Bash?

A: Command substitution lets you run a command inside another command and use its output dynamically, using the syntax $(command).

Q: What is the difference between $(…) and backticks?

A: $(...) is modern, supports nesting, and is easier to read. Backticks `command` are older and less flexible.

Q: How do I use command substitution to create dynamic filenames?

A: You can embed $(date) or other commands in a filename, for example: filename="backup-$(date +%F).tar.gz".

Q: Can I use multiple commands inside $(…)?

A: Yes, you can nest commands or combine them with pipes, like echo "Top process: $(ps aux | sort -nrk 3,3 | head -1)".

Q: Why should I quote command substitutions in Bash?

A: Quoting ensures that spaces or special characters in the output do not break your commands, e.g., name="$(whoami)".

Learn Bash Scripting Today!

Bash scripting is one of the most valuable skills for Linux system administration. It helps automate repetitive tasks, manage servers efficiently, and handle complex operations with just a few lines of code.

It's like having a Swiss Army knife for automating tasks, managing systems, and solving problems efficiently.

We have compiled 28 useful topics with examples to learn bash scripting. Check the following link for more details:

Conclusion

Bash command substitution is a small feature with big impact. It makes your scripts dynamic, clean, and more powerful.

By learning $(...), you can automate tasks, fetch system information, and even handle real-world problems like installing the latest software automatically.

Command substitution is incredibly useful for creating dynamic, responsive bash scripts. Start with simple examples and gradually work your way up to more complex use cases as you get comfortable with the concept.

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐