ninja_ken  

同志们,前面已经打好了必要的基础,现在开始我们进入相对高阶一点的部分——Bash扩展(或者叫展开,expansion)。在Bash里存在许多特定的用法,其背后Bash在默默修改了我们的输入、完成各种替换,有时候最终的替换结果甚至令人出乎意料(大部分时候是哪里写错了,哈)。因为Bash扩展的种类比较多,我们按照某种特定的顺序(在“Bash命令的执行过程再剖析”一节进一步解释),分三节把它们逐个捋一下

  1. 大括号扩展
  2. 波浪线扩展
  3. 参数(变量)扩展
  4. 算术扩展
  5. 路径扩展

大括号扩展(Brace Expansion

大括号扩展一般可用于两种场景,一是通过前、后缀拼接,自动生成多个字符串,二是生成一段数字或字母序列。稍微一演示,大伙儿准明白

[ken bash]$echo hello 小{明,刚,莉}
hello 小明 小刚 小莉

我们把前缀“小”字放在大括号前面,大括号内部以逗号分隔,这样就自动生成了"小明" "小刚" "小莉"三个字符串,实际的命令变为echo hello 小明 小刚 小莉。大括号扩展可以组合或嵌套使用,下面举一个组合的例子

[ken bash]$touch file.a.1
[ken bash]$touch file.a.2
[ken bash]$touch file.b.1
[ken bash]$touch file.b.2
[ken bash]$ls -l file.{a,b}.{1,2}
-rw-r--r-- 1 ken ken 0  4月29日 10:14 file.a.1
-rw-r--r-- 1 ken ken 0  4月29日 10:14 file.a.2
-rw-r--r-- 1 ken ken 0  4月29日 10:14 file.b.1
-rw-r--r-- 1 ken ken 0  4月29日 10:14 file.b.2

利用两个大括号,我们创造出4个字符串(2*2组合)。关于大括号嵌套的例子(大括号里面的大括号),大家可以自己尝试下。
现在我们来演示下用大括号生成序列,其形式为{N..M..Increment},其中N为起始值,M为结束值,Increment为递增值

[ken bash]$echo {1..10}
1 2 3 4 5 6 7 8 9 10
[ken bash]$for i in {0..10..2}; do echo $i; done
0
2
4
6
8
10

聪明的你,很快就学会了吧^_^

波浪线扩展(Tilde Expansion

这个应该算是最简单的Bash扩展了,它主要用于家目录路径的替换。Linux系统上每个用户一般都有个家目录(home directory),位于/home/username。当我们懒得键盘手打出来某个用户(一般是自己)的家目录路径时,可以直接写~代替。

[ken bash]$ls ~
公共  模板  视频  图片  文档  下载  音乐  桌面  bin  go
[ken ~]$echo ~
/home/ken

波浪线~的后面还可以跟用户名,这样子波浪线扩展会替换为相应用户的家目录,如

[ken ~]$echo ~root
/root
[ken ~]$echo ~ken
/home/ken

其实波浪线扩展最常使用的场景是变量赋值,尤其是PATH变量,它的值决定了执行Bash命令时去哪些路径下寻找相应的程序

PATH=$PATH:~/bin:~/tools/bin

上面的赋值语句相当常见,它意思是在PATH原值的基础上,增加~/bin~/tools/bin两个目录(PATH目录之间用:分隔)

posted on 2023-04-29 10:40  ninja_ken  阅读(77)  评论(0)    收藏  举报