3.8 快速引用参数的部分内容
在上一节我们介绍了如何引用历史命令中的参数,除此之外,Shell 甚至比我们想要得到的做得更多。利用 Shell 提供的历史展开模式修饰符,使我们得以快速引用参数中的部分内容。
3.8.1 引用路径开头
请看例子:
在此,我想引用该路径的开头部分 /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
引用后,我们的命令变成了:
3.8.3 引用文件名
对于存在文件名的情形,我们还可以利用 :r
修饰符来只引用文件名部分(这将排除掉扩展名)。例如:
这里的 !$:r
将 hello.zip
去掉扩展名,只保留 hello
部分。
3.8.4 将引用部分更改为大写
下面介绍的两个修饰符为 zsh 所特有,bash 目前尚不支持。通过 :u
修饰符,我们能够将所引用的部分更改为大写字母。
这里的 !$:u
将 histchars
全部更改为大写字母。
3.8.5 将引用部分更改为小写
与 :u
相对的是,:l
则使我们能够将所引用的参数全部更改为小写字母。
这里的 !$:l
将 SAVEHIST
全部更改为小写字母。
需要特别指出的是,Shell 还支持将多个修饰符进行联用,在它们之间只需使用 :
(冒号) 分隔即可。例如:
xiaodong@codeland:~$ ls /usr/share/fonts/truetype
xiaodong@codeland:~$ echo !$:t:u
xiaodong@codeland:~$ echo TRUETYPE
这里,我们先用 :t
引用了路径的结尾部分,然后又使用 :u
将其更改为了大写字母。