关于语法:什么是Bash中的!$

What is bang dollar (!$) in Bash?

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

例如。

1
2
3
4
5
$ ls -l
 .... something
$ !$
-l
bash: -l command not found

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


这是上一个命令的最后一个参数。从文档中:

!!:$

designates the last argument of the preceding command. This may be shortened to !$.

备注。如果您想了解bash的历史,我建议您打开shell选项histverify,如下所示:

1
shopt -s histverify

(你也可以把它放在你的.bashrc里,让它永久地戴上)。使用历史替换时,不会立即执行替换;而是将其放在readline的缓冲区中,等待您按Enter…或不按!

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

1
2
3
4
5
6
7
8
$ { echo zee; }
zee
$ echo"$_"
zee
$ { echo zee; }
zee
$ echo !$
$ echo }

也:

1
2
3
4
5
6
7
$ if true; then echo one; else echo two; fi
one
$ echo"$_"
one
$ if true; then echo one; else echo two; fi
$ echo !$
$ echo fi

还有:

1
2
3
4
5
$ echo zee; echo"$_"
zee
zee
$ echo zee2; echo !$
$ echo zee2; echo"$_"

而且

1
2
3
4
5
6
7
8
$ echo {1..3}
1 2 3
$ echo"$_"
3
$ echo {1..3}
1 2 3
$ echo !$
$ echo {1..3}

而且

1
2
3
4
5
6
7
$ echo one ;
$ echo"$_"
one
$ echo one ;
one
$ echo !$
$ echo ;

还有很多其他的例子,例如别名。


!$可以做$_所做的,除非$_不存储它返回(作为它的替代)到history的值。

下面是一个例子。

!$一起

1
2
3
4
5
6
7
8
9
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

$_一起

1
2
3
4
5
6
7
8
9
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$

更多选择:

1
2
3
4
5
6
7
8
!^      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


猴子的回答:

哇!$您可以轻松打印上一个命令的最后一个字。

1
2
3
4
#Create new file
touch newfile.txt
#Edit new file using !$ instead newfile.txt again
nano !$