Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to echo "$x_$y" in Bash script?

Tags:

string

bash

shell

It is very interesting that if you intend to display 0_1 with Bash using the code

x=0
y=1
echo "$x_$y"

then it will only display

1

I tried echo "$x\_$y" and it doesn't work.

How can I echo the form $x_$y? I'm going to use it on a file name string.

like image 375
tomriddle_1234 Avatar asked Jan 18 '13 01:01

tomriddle_1234


2 Answers

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 :-)

like image 117
paxdiablo Avatar answered Oct 13 '22 21:10

paxdiablo


This way:

$ echo "${x}_${y}"
0_1
like image 44
Guru Avatar answered Oct 13 '22 21:10

Guru