带有感叹号的字符串的回声

带有感叹号的字符串的回声

以下是我在 bash 中输入的内容以及我得到的关于“echo”的结果:

$ echo '!$'   
!$  
$ echo "!$"  
echo "'!$'"  
'!$'

我想知道“echo”如何处理第二个输入。在我看来,“echo”会首先打印您输入的字符串(如果需要,则扩展一些字符串),然后执行某些字符串(如果它们是可执行的)。

我可以构造但无法理解的一个更令人兴奋的例子是:

$ echo '!$'  
!$  
$ echo "!echo "!$""  
echo "echo '!$' "'!$'""  
echo '!$' !$

答案1

在命令中:

echo "!$"

!$bash由before扩展至echo双引号内,如果启用,将执行历史扩展,除非您!使用反斜杠转义\bash已经完成了扩展,echo这里什么也不做,它只是打印得到的内容。

!$引用前面命令的最后一个参数,即 string '!$'

在你的第二个例子中:

$ echo '!$'
!$
$ echo "!echo "!$""
echo "echo '!$' "'!$'""
echo '!$' !$

Command echo "echo '!$' "'!$'"",传递给的参数echo分为三个部分:

  • 首先:"echo '!$' ",扩展为 string echo '!$'
  • 第二:'!$',扩展为 string !$
  • 第三:"",扩展为空字符串。

答案2

echo只是迭代其参数并将它们发送到标准输出。

所有的魔法都是由 shell 完成的:shell 用一些模式替换其他模式。例如变量(以 开头$)、历史记录(以 开头!)等。

请参阅bash手册了解更多详细信息。

相关内容