How to properly nest Bash backticks

Any time you want to evaluate a command use command substitution:

$(command)

Any time you want to evaluate an arithmetic expression use expression substitution:

$((expr))

You can nest these like this:

Let's say file1.txt is 30 lines long and file2.txt is 10 lines long, than you can evaluate an expression like this:

$(( $(wc -l file1.txt) - $(wc -l file2.txt) ))

which would output 20 ( the difference in number of lines between two files).


if you insist to use backticks, following could be done

$ echo "hello1-`echo hello2-\`echo hello3-\\\`echo hello4\\\`\``"

you have to put backslashes, \\ \\\\ \\\\\\\\ by 2x and so on, its just very ugly, use $(commands) as other suggested.


It's a lot easier if you use bash's $(cmd) command substitution syntax, which is much more friendly to being nested:

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4

Use $(commands) instead:

$ echo "hello1-$(echo hello2-$(echo hello3-$(echo hello4)))"
hello1-hello2-hello3-hello4

$(commands) does the same thing as backticks, but you can nest them.

You may also be interested in Bash range expansions:

echo hello{1..10}
hello1 hello2 hello3 hello4 hello5 hello6 hello7 hello8 hello9 hello10