Bash 中的 bang 美元 (!$) 是啥?

Posted

技术标签:

【中文标题】Bash 中的 bang 美元 (!$) 是啥?【英文标题】:What is bang dollar (!$) in Bash?Bash 中的 bang 美元 (!$) 是什么? 【发布时间】:2017-05-14 02:13:04 【问题描述】:

Bang Dollar 似乎指的是最后一个命令行的最后一部分。

例如

$ ls -l
 .... something
$ !$
-l
bash: -l command not found

我可以在美元变量上找到很多(例如$!),但在这个上找不到。有什么解释吗?

【问题讨论】:

! 通常/经常与历史命令相关。 根据this answer,是上一条命令的最后一个参数 【参考方案1】:

猴子的回答:

whit !$ 您可以轻松打印上一条命令的最后一个单词

#Create new file
touch newfile.txt
#Edit new file using !$ instead newfile.txt again
nano !$

【讨论】:

【参考方案2】:

!$ 可以做$_ 所做的事情,除了$_ 不会将它返回的值(作为它的替代)存储到history

这是一个例子。

!$

za:tmep za$ ls -lad 
drwxr-xr-x  4 za  staff  136 Apr  6  2016 .
za:tmep za$ !$
-lad
-bash: -lad: command not found
za:tmep za$ history | tail -n 3
  660  ls -lad 
  661  -lad                     <<== history shows !$ substitution.  
  662  history | tail -n 3

$_

za:tmep za$ ls -lad
drwxr-xr-x  4 za  staff  136 Apr  6  2016 .
za:tmep za$ $_
-bash: -lad: command not found
za:tmep za$ history | tail -n 3
  663  ls -lad
  664  $_         <<== history shows $_ and not its substitution. 
  665  history | tail -n 3
za:tmep za$ 

更多选项:

!^      first argument
!:2     second argument
!:2-$   second to last arguments
!:2*    second to last arguments
!:2-    second to next to last arguments
!:2-3   second to third arguments
!$      last argument
!*      all arguments

【讨论】:

从技术上讲,!$$_相同。 !$ 作用于更高的层次。您可以使用别名、复合命令或多个命令查看差异。在以下情况下比较echo !$echo $_: 1. echo zee; ; 2.if true; then echo one; else echo two; fi; 3. 同时输入两个命令,例如echo zee; echo $_echo zee2; echo $!【参考方案3】:

这是上一个命令的最后一个参数。来自documentation:

!!:$

指定前面命令的最后一个参数。这可以缩短为!$

备注。如果你想玩转 Bash 的历史,我建议你打开 shell 选项histverify,如下所示:

shopt -s histverify

(您也可以将其放入您的.bashrc 以永久启用)。使用历史替换时,不会立即执行替换;相反,它被放入了 readline 的缓冲区,等待你按 enter... 或不!


为了准确起见,输入!$ 不等于输入"$_"!$ 实际上是一个历史替换, 指的是上一个命令的最后一个字已输入,"$_" 是先前执行 命令的最后一个参数。你可以比较两者(我有shopt -s histverify):

$  echo zee; 
zee
$ echo "$_"
zee
$  echo zee; 
zee
$ echo !$
$ echo 

还有:

$ if true; then echo one; else echo two; fi
one
$ echo "$_"
one
$ if true; then echo one; else echo two; fi
$ echo !$
$ echo fi

还有:

$ echo zee; echo "$_"
zee
zee
$ echo zee2; echo !$
$ echo zee2; echo "$_"

还有

$ echo 1..3
1 2 3
$ echo "$_"
3
$ echo 1..3
1 2 3
$ echo !$
$ echo 1..3

还有

$ echo one ;
$ echo "$_"
one
$ echo one ;
one
$ echo !$
$ echo ;

还有很多其他示例,例如,使用别名。

【讨论】:

^1 是很好的例子.....所以它们都有共同的功能,但它们并不相同。 @zee:确实,他们并没有真正处于同一水平。 ++ 的例子很好。 ... 但只能在 interactive 模式下工作!!:比较 bash -c $'echo hello world\necho !$'bash -c $'echo hello world\necho $_' ... 我有一个“快乐”,我有一个“过年”,汗! “新年快乐!”,@gniourf_gniourf! @F.Hauri:当然,这是关于历史扩展的。

以上是关于Bash 中的 bang 美元 (!$) 是啥?的主要内容,如果未能解决你的问题,请参考以下文章

sudo bang bang 到底是啥? [关闭]

dollar是啥意思

VTL 中的美元和感叹号(爆炸)符号

领先的美元符号如何影响 Bash 中的单引号?

脚本中的#! /bin/bash是什么意思?

JSP中的美元花括号$是啥意思?