【问题标题】: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,是上一条命令的最后一个参数

标签: bash syntax symbols


【解决方案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:当然,这是关于历史扩展的。
    猜你喜欢
    • 2020-01-18
    • 1970-01-01
    • 2014-12-21
    • 2013-02-14
    • 2016-01-24
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多