16

非常有趣的是,如果您打算0_1使用 Bash 显示代码

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

那么它只会显示

1

我试过echo "$x\_$y"了,它不起作用。

如何回显表单$x_$y?我将在文件名字符串上使用它。

4

4 回答 4

26

因为变量名中允许有下划线,所以命令:

echo "$x_$y"

正在尝试回显${x_}(在您的情况下可能为空),然后是${y}. 这样做的原因是因为参数扩展是一个贪婪的操作——它会在 之后尽可能多的合法字符$来形成一个变量名。

手册页的相关部分bash指出:

$字符引入了参数扩展、命令替换或算术扩展。

要扩展的参数名称或符号可以用大括号括起来,这是可选的,但用于保护要扩展的变量免受紧随其后的字符的影响,这些字符可以解释为名称的一部分。

当使用大括号时,匹配的结束大括号是第一个}不被反斜杠转义或在带引号的字符串中,并且不在嵌入的算术扩展、命令替换或参数扩展中。

因此,解决方案是确保_视为第一个变量的一部分,这可以通过以下方式完成:

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

我倾向于像这样做我所有的 bash 变量,甚至像这样的独立变量:

echo "${x}"

因为它更明确,而且我过去被咬过很多次:-)

于 2013-01-18T01:24:35.633 回答
12

这边走:

$ echo "${x}_${y}"
0_1
于 2013-01-18T01:09:43.483 回答
8

用花括号括起来:

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

于 2013-01-18T01:09:51.700 回答
5

只是为了逆势而上,你也可以这样做:

echo $x'_'$y

您可以将引用和未引用的部分彼此相邻,中间没有空格。而且由于'不是变量名的合法字符,bash 将仅替换$x. :)

于 2013-01-18T01:38:39.817 回答