How to echo “$x_$y” in Bash script?

Because variable names are allowed to have underscores in them, the command:

echo "$x_$y"

is trying to echo ${x_} (which is probably empty in your case) followed by ${y}. The reason for this is because parameter expansion is a greedy operation – it will take as many legal characters as possible after the $ to form a variable name.

The relevant part of the bash manpage states:

The $ character introduces parameter expansion, command substitution, or arithmetic expansion.

The parameter name or symbol to be expanded may be enclosed in braces, which are optional but serve to protect the variable to be expanded from characters immediately following it which could be interpreted as part of the name.

When braces are used, the matching ending brace is the first } not escaped by a backslash or within a quoted string, and not within an embedded arithmetic expansion, command substitution, or parameter expansion.

Hence, the solution is to ensure that the _ is not treated as part of the first variable, which can be done with:

echo "${x}_${y}"

I tend to do all my bash variables like this, even standalone ones like:

echo "${x}"

since it’s more explicit, and I’ve been bitten so many times in the past 🙂

Leave a Comment