了解反引号 (`)

coo*_*ric 45 shell bash command-substitution

我正在尝试命令

$ b=5; echo `$b`;
-bash: 5: command not found
Run Code Online (Sandbox Code Playgroud)

但它没有像预期的那样打印 5。我在这里缺少什么?

`(反引号/反引号)在命令中是什么意思?似乎说`评估其中的命令并用输出替换它们。

Krz*_*ski 66

反引号之间的文本被执行并替换为命令的输出(减去尾随的换行符,并注意当输出中有 NUL 字符时 shell 行为会有所不同)。这称为命令替换,因为它被命令的输出替换。所以如果你想打印 5,你不能使用反引号,你可以使用引号,像echo "$b"或者只是去掉任何引号并使用echo $b.

如您所见,由于$b包含 5,当使用反引号bash试图运行命令时5,由于没有这样的命令,它会失败并显示错误消息。

要了解反引号的工作原理,请尝试运行以下命令:

$ A=`cat /etc/passwd | head -n1`
$ echo "$A"
Run Code Online (Sandbox Code Playgroud)

cat /etc/passwd |head -n1应该打印/etc/passwd文件的第一行。但由于我们使用反引号,它不会在控制台上打印出来。相反,它存储在A变量中。你可以回应$A这个。请注意,打印第一行的更有效方法是使用命令,head -n1 /etc/passwd但我想指出反引号内的表达式不必很简单。

因此,如果 /etc/passwd 的第一行是root:x:0:0:root:/root:/bin/bash,则第一个命令将被 bash 动态替换为A="root:x:0:0:root:/root:/bin/bash"

请注意,此语法是 Bourne shell 的语法。引用和转义很快就会变成一场噩梦,尤其是当你开始嵌套它们时。Ksh 引入了$(...)现在标准化(POSIX)并被所有 shell(甚至 Unix v9 中的 Bourne shell)支持的替代方案。因此,您$(...)现在应该改用,除非您需要可移植到非常旧的 Bourne shell。

还要注意的是输出`...`$(...)受到分词和文件名生成就像变扩建(在zsh中,分词只),所以一般都需要在列表上下文被引用。

  • @erikb85:此注释不是我添加的,但我已按照您的建议使用链接对其进行了编辑:) (2认同)

ter*_*don 11

反引号完全按照你说的做。您已将变量设置为整数。当您将该变量放在反引号中时,bash 将尝试将其作为命令执行。由于它不是命令,因此您会收到所看到的错误。

你想要做的很简单:

$ b=5; echo $b
Run Code Online (Sandbox Code Playgroud)

为了更好地理解反引号,请比较:

$ b=5; a=`echo $b`; echo $a
  5
Run Code Online (Sandbox Code Playgroud)


ger*_*ijk 9

一步一步地,你的线路应该解释它。

$ b=5; echo `$b`;
Run Code Online (Sandbox Code Playgroud)
  1. 将变量设置b为 5
  2. 评估$b(有效运行5
  3. echoes 上面评估的输出。

所以是的,你得到的输出是预期的。您正在评估变量的内容,而不是您认为的实际命令。您放在反引号中的所有内容都在新的(子)shell 中进行了 simplay 评估(运行)。