3.8 快速引用参数的部分内容

在上一节我们介绍了如何引用历史命令中的参数,除此之外,Shell 甚至比我们想要得到的做得更多。利用 Shell 提供的历史展开模式修饰符,使我们得以快速引用参数中的部分内容。

3.8.1 引用路径开头

请看例子:

xiaodong@codeland:~$ ls /usr/share/fonts/truetype
xiaodong@codeland:~$ cd !$:h

在此,我想引用该路径的开头部分 /usr/share/fonts。为了达到这个目的,我在 !$(最后一位参数)的基础上添加了 :h。此处的 :h 为修饰符,意味着截取路径的开头部分,正如 dirname 的效果一样。

3.8.2 引用路径结尾

有头就有尾。通过 :t 修饰符,我们可以引用路径的结尾部分,其效果跟 basename 类似。

xiaodong@codeland:~$ wget http://nginx.org/download/nginx-1.15.8.tar.gz
xiaodong@codeland:~$ tar zxvf !$:t

经过 !$:t 引用后,我们的命令变成了:

xiaodong@codeland:~$ tar zxvf nginx-1.15.8.tar.gz

3.8.3 引用文件名

对于存在文件名的情形,我们还可以利用 :r 修饰符来只引用文件名部分(这将排除掉扩展名)。例如:

xiaodong@codeland:~$ unzip hello.zip
xiaodong@codeland:~$ cd !$:r

这里的 !$:rhello.zip 去掉扩展名,只保留 hello 部分。

3.8.4 将引用部分更改为大写

下面介绍的两个修饰符为 zsh 所特有,bash 目前尚不支持。通过 :u 修饰符,我们能够将所引用的部分更改为大写字母。

xiaodong@codeland:~$ echo histchars
xiaodong@codeland:~$ echo !$:u

这里的 !$:uhistchars 全部更改为大写字母。

3.8.5 将引用部分更改为小写

:u 相对的是,:l 则使我们能够将所引用的参数全部更改为小写字母。

xiaodong@codeland:~$ echo SAVEHIST
xiaodong@codeland:~$ echo !$:l

这里的 !$:lSAVEHIST 全部更改为小写字母。

需要特别指出的是,Shell 还支持将多个修饰符进行联用,在它们之间只需使用 : (冒号) 分隔即可。例如:

xiaodong@codeland:~$ ls /usr/share/fonts/truetype
xiaodong@codeland:~$ echo !$:t:u
xiaodong@codeland:~$ echo TRUETYPE

这里,我们先用 :t 引用了路径的结尾部分,然后又使用 :u 将其更改为了大写字母。