Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.5k views
in Technique[技术] by (71.8m points)

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

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.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...