我正在尝试命令
$ b=5; echo `$b`;
-bash: 5: command not found
但它不会按预期打印5。我在这里想念什么?
命令中的`(反引号/反引号)是什么意思?似乎说可以`
评估其中的命令并将其替换为输出。
我正在尝试命令
$ b=5; echo `$b`;
-bash: 5: command not found
但它不会按预期打印5。我在这里想念什么?
命令中的`(反引号/反引号)是什么意思?似乎说可以`
评估其中的命令并将其替换为输出。
Answers:
反引号之间的文本将被执行,并由命令的输出替换(减去尾随的换行符,请注意,当输出中包含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将动态替换first命令为A="root:x:0:0:root:/root:/bin/bash"
。
请注意,此语法属于Bourne shell。报价和转义迅速成为噩梦,尤其是当您开始嵌套它们时。Ksh引入了$(...)
现在已经标准化的替代方案(POSIX),并且所有外壳程序(甚至是Unix v9的Bourne外壳程序)都支持它。因此,$(...)
除非您需要将其移植到非常旧的Bourne外壳,否则现在应该使用它代替。
还要注意的是输出`...`
和$(...)
受到分词和文件名生成就像变扩建(在zsh中,分词只),所以一般都需要在列表上下文被引用。
you can use quotation marks, like echo "$b"
=>“”有什么特别之处吗?似乎echo $b
同样有效。
echo
命令不关心它获取的参数数量,因此如果b
内部有空格,它将获得多个参数并仍将其打印出来。其他命令可能不是这种情况(尤其是在未设置变量的情况下),因此我倾向于总是用引号将变量引起来。
(POSIX)
可以链接到实际标准,那将很好。
逐步讲解您的路线。
$ b=5; echo `$b`;
b
为5$b
(有效运行5
)echo
是上面评估的输出。是的,您得到的输出是预期的。您正在评估变量的内容,而不是您认为的实际命令。您放入反引号中的所有内容都会在新的(子)shell中进行simplay评估(运行)。