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中,分词只),所以一般都需要在列表上下文被引用。
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)
一步一步地,你的线路应该解释它。
$ b=5; echo `$b`;
Run Code Online (Sandbox Code Playgroud)
b
为 5$b
(有效运行5
)echo
es 上面评估的输出。所以是的,你得到的输出是预期的。您正在评估变量的内容,而不是您认为的实际命令。您放在反引号中的所有内容都在新的(子)shell 中进行了 simplay 评估(运行)。
归档时间: |
|
查看次数: |
86790 次 |
最近记录: |