Bash中变量替换中的反斜杠

4 bash shell-script quoting variable-substitution

我正在编写一个 Bash 脚本来帮助正确地对硬盘进行分区,但我遇到了一个奇怪的问题,我必须将一个数字附加到一个变量中。我花了一段时间才得到正确的结果,因为我对 Bash 不是很有经验,但我设法做了一些临时的事情。

这是我正在构建的示例:

#!/bin/bash

devName="/dev/sda"
devTarget=$devName\3

echo "$devTarget"
Run Code Online (Sandbox Code Playgroud)

变量devName/dev/sda,但我还需要稍后在脚本中为第三个分区设置一个变量,所以我使用了\符号,它让我将数字添加3/dev/sda以进行输出/dev/sda3

尽管该\符号有效,但我只是想知道这是否是执行此类操作的正确方法。我使用它是因为在 Python 中它习惯于忽略引号等的以下字符,但我想在这种情况下做相反的事情,所以令人惊讶的是它起作用了。如果这不是添加变量的最佳方法,请有人举例说明在 Bash 中执行此操作的最佳方法。

小智 8

将变量插入字符串的安全方法是使用${var_name}. 例如:

#!/bin/bash

devName="/dev/sda"
devTarget="${devName}3"

echo "$devTarget"
Run Code Online (Sandbox Code Playgroud)

这样 Bash 就不会怀疑要插入的变量是什么。

顺便说一句,有趣的devTarget=$devName\3工作原理。我不知道为什么。

  • @KyleCurtis `\3`,这并不奇怪,如果你不希望 3 作为变量名 `devName3` 的一部分,你应该将它转义为单独打印,就像你做的那样 ``\\`` 打印``\`` 并且因为 ``\`` 是 shell 中的特殊字符,因此它解释为变量名称之外的含义。 (3认同)

ilk*_*chu 5

$x\b以与$x"b"or相同的方式"$x"b工作,引号结束变量名。如果没有其他原因,我认为这是因为在扩展变量时引号仍然存在并且\"'变量名中没有一个是有效的。

标准文本说:

单词扩展顺序如下:

1. ...,参数扩展(见参数扩展),...

4. 报价删除(见报价删除)应始终最后执行。

而“引用删除”是实际删除引号字符的步骤。

但是,正如@tomasz在他们的回答中所说在变量名周围加上大括号是通常的做法,所以"${x}b", 或"${devName}3"。您几乎总是想在扩展周围加上引号,请参阅何时需要双引号?

(不过,我想知道是否还有其他方法可以在程序中标记带引号的字符串,而不是实际保留引号字符。)