了解反引号 (`)

了解反引号 (`)

我正在尝试命令

$ b=5; echo `$b`;
-bash: 5: command not found

但它没有按预期打印 5。我在这里缺少什么?

`(反引号/反引号)在命令中意味着什么?似乎是说`评估其中的命令并将其替换为输出。

答案1

反引号之间的文本将被执行并替换为命令的输出(减去尾随换行符,请注意,当输出中存在 NUL 字符时,shell 行为会有所不同)。它被称作命令替换因为它被命令的输出替换。因此,如果您想打印 5,则不能使用反引号,可以使用引号,例如echo "$b"或仅删除任何引号并使用echo $b.

如您所见,由于$b包含 5,因此当使用反引号bash尝试运行命令时5,由于不存在此类命令,因此会失败并显示错误消息。

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

$ A=`cat /etc/passwd | head -n1`
$ echo "$A"

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 中,仅分词),因此通常需要在列表上下文中引用。

答案2

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

你想做的很简单:

$ b=5; echo "$b"

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

$ b=5; a=`echo "$b"`; echo "$a"
5

答案3

一步一步地看你的线应该能解释它。

$ b=5; echo `$b`;
  1. 将变量设置b为 5
  2. 评估$b(有效运行5
  3. echoes 上述评估的输出。

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

相关内容