目录

linux {花括号} 基本用法

我们经常会批量修改文件名,保留扩展名或转换文件格式或提取文件名,那么下面的一些命令将很有用。

/images/linux-on-wood.webp
linux (image)

使用%操作符提取文件名

1
2
3
4
touch sample.jpg
file_jpg="sample.jpg"
name=${file_jpg%.*}
echo "File name is: $name"

原理

${VAR%.*} 从右往左删除%右边匹配的字符,上例中的(.*)匹配到的是.jpg,所以输出结果只有文件名。

也可以使用%%操作符,与%%%相比,%是最短匹配也叫非贪婪匹配,%%是最长匹配也叫贪婪匹配。

使用#操作符提取扩展名

1
2
3
touch sample.jpg
extension=${file_jpg#*.}
echo "File Extension is: $extension"

原理

${VAR#*.} 从左往右匹配,删除匹配到的字符。 和%%类似,#也有一个对应的贪婪操作符##。

例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ URL="www.google.com"
$ echo $URL
$ echo ${URL%.*} # 删除从右侧开始第一个.匹配的内容,为非贪婪匹配
www.google
$ echo ${URL%%.*} # 删除从右侧开始所有.右端的内容,为贪婪匹配
www
$ echo ${URL#*.} # 删除从左侧开始第一个.匹配的内容,为非贪婪匹配,过滤出二级域名
google.com
$ echo ${URL##*.} # 删除从左侧开始所.匹配的内容,为贪婪匹配,过滤出顶级域名
com

考虑文件名中可能有多个.所以贪婪匹配更常用

关于{Curly Braces} 操作符其他用法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 按顺序生成连续的数字
$ echo {0..10}
0 1 2 3 4 5 6 7 8 9 10

# 按倒序生成连续的数字
$ echo {10..0}
10 9 8 7 6 5 4 3 2 1 0

# 按步长倒序生成数字
$ echo {10..0..2}
10 8 6 4 2 0

# 按位置输出
$ month=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
$ echo ${month[3]}
Apr

# 修改后缀
$ file_img=image.jpg
$ echo ${file_img%jpg}png
image.png
# 可以使用 convert $i ${i%jpg}png 转换图片格式
# 批量转换 for i in *.jpg; do convert $i ${i%jpg}png; done

# 判断变量是否有值
fname=test.jpg
$ echo ${fname:+abc}
abc
fname="" # 变量为空不输出
$ echo ${dname:+abc}
# ${dname:-def} 与 ${fname:+abc} 用法相反

# 替换后缀名
$ fname="1.txt"
$ echo ${fname/.txt/.log}
1.log