如何在bash脚本中回显"$ x_ $ y"?

tom*_*234 13 linux string bash shell

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

x=0
y=1
echo "$x_$y"
Run Code Online (Sandbox Code Playgroud)

然后它只会显示

1
Run Code Online (Sandbox Code Playgroud)

我试过0_1但它不起作用.

所以我的问题是如何回显形式$ x_ $ y?我将在文件名字符串上使用它.

pax*_*blo 23

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

echo "$x_$y"
Run Code Online (Sandbox Code Playgroud)

试图回声${x_}(在你的情况下可能是空的)接着是${y}.这是因为参数扩展是一个贪婪的操作 - 在$形成变量名之后,它将需要尽可能多的合法字符.

bash联机帮助页的相关部分说明:

$角色引入了参数扩展,命令替换或算术扩展.

要扩展的参数名称或符号可以用大括号括起来,大括号是可选的,但用于保护变量从紧跟在其后面的字符扩展,这些字符可以被解释为名称的一部分.

使用大括号时,匹配的结束大括号是第一个}不用反斜杠或带引号的字符串转义的,而不是嵌入式算术扩展,命令替换或参数扩展.

因此,该解决方案是确保_作为第一变量,它是可以做到的一部分进行处理:

echo "${x}_${y}"
Run Code Online (Sandbox Code Playgroud)

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

echo "${x}"
Run Code Online (Sandbox Code Playgroud)

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


Gur*_*uru 11

这条路:

$ echo "${x}_${y}"
0_1
Run Code Online (Sandbox Code Playgroud)


Aus*_*eco 8

用花括号包裹它:

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

  • 因为变量可以在其中有下划线而不是点 - 使用下划线它会认为你有变量`$ x_`和`$ y`.但有了点,它不会混淆 (6认同)

Eev*_*vee 5

只是为了逆转潮流,您也可以这样做:

echo $x'_'$y
Run Code Online (Sandbox Code Playgroud)

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

  • 并且,对于另一种处理它的方式:`x = 0; Y = 1; Z = _; echo"$ x $ z $ y";` (2认同)