我正在尝试命令
$ 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`;
- 将变量设置
b
为 5 - 评估
$b
(有效运行5
) echo
es 上述评估的输出。
所以是的,您得到的输出是预期的。您正在评估变量的内容,而不是您认为的实际命令。您放入反引号内的所有内容都会在新的(子)shell 中简单评估(运行)。