${VAR%.*} 的含义
❏ 从 $VAR中删除位于%右侧的通配符(在上例中是.*)所匹配的字符串。通配符从右向左进行匹配。
❏ 给VAR赋值,即VAR=sample.jpg。通配符从右向左匹配到的内容是.jpg,因此从$VAR中删除匹配结果,得到输出sample。
%属于非贪婪(non-greedy)操作。它从右向左找出匹配通配符的最短结果。
还有另一个操作符%%,它与%相似,但行为模式却是贪婪的,这意味着它会匹配符合通配符的最长结果。
例如
[root@hadoop100 test]# url="www.google.com.hk" [root@hadoop100 test]# # 使用%操作符从右向左执行非贪婪匹配 [root@hadoop100 test]# echo ${url%.*} www.google.com #使用%%操作符从右向左执行贪婪匹配 [root@hadoop100 test]# echo ${url%%.*} www
不同分隔符都可以这样使用
[root@hadoop100 test]# a="www-google-com-hk" [root@hadoop100 test]# [root@hadoop100 test]# [root@hadoop100 test]# echo ${a%.*} www-google-com-hk [root@hadoop100 test]# echo ${a%-*} www-google-com [root@hadoop100 test]# echo ${a%%-*} www
${VAR#*.}的含义
#操作符可以从文件名中提取扩展名。这个操作符与%类似,不过求值方向是从左向右
从$VARIABLE中删除位于#右侧的通配符(即在上例中使用的*.)从左向右所匹配到的字符串。和%%类似,
#也有一个对应的贪婪操作符##。##从左向右进行贪婪匹配,并从指定变量中删除匹配结果。来看一个例子:
# 使用#操作符从左向右执行非贪婪匹配 [root@hadoop100 test]# echo ${url#*.} google.com.hk [root@hadoop100 test]# # 使用##操作符从左向右执行贪婪匹配 [root@hadoop100 test]# echo ${url##*.} hk
考虑到文件名中可能包含多个.字符,所以相较于#,##更适合于从中提取扩展名。##执行的是贪婪匹配,因而总是能够准确地提取出扩展名
--update 2023年5月5日11:34:56
实例
for i in ${images};do echo ${i} ; echo ${i##*/} ;done registry.cn-hangzhou.aliyuncs.com/kainstall/kube-apiserver:v1.22.10 kube-apiserver:v1.22.10 registry.cn-hangzhou.aliyuncs.com/kainstall/kube-scheduler:v1.22.10 kube-scheduler:v1.22.10 registry.cn-hangzhou.aliyuncs.com/kainstall/kube-controller-manager:v1.22.10 kube-controller-manager:v1.22.10 registry.cn-hangzhou.aliyuncs.com/kainstall/kube-proxy:v1.22.10 kube-proxy:v1.22.10 rancher/mirrored-flannelcni-flannel:v0.16.3 mirrored-flannelcni-flannel:v0.16.3 rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.1 mirrored-flannelcni-flannel-cni-plugin:v1.0.1 registry.cn-hangzhou.aliyuncs.com/kainstall/etcd:3.5.0-0 etcd:3.5.0-0 registry.cn-hangzhou.aliyuncs.com/kainstall/coredns:v1.8.4 coredns:v1.8.4 registry.cn-hangzhou.aliyuncs.com/kainstall/pause:3.5 pause:3.5
tr、sed、变量替换伯仲之间
#!/usr/bin/env bash #echo 'text here' string="stirng" ; echo "$string" | sed -e "s/ir/ri/" # 效率高于sed ,参见https://www.shellcheck.net/wiki/SC2001 string="stirng" ; echo "${string//ir/ri}" # 获取最后一个字符 string="stirng" ; echo "$string" | sed -e "s/^.*\(.\)$/\1/" url=/dfs/acf/A1575A1BPK1/A1298/A129803C/A129803CAR/FORMAT/A3353A129803CAR.TXT # 获取文件名 #basename ${url} # 获取路径 #dirname ${url} # 变量截取从右向左非贪婪匹配,也就是说匹配到一个/就停止 echo ${url%/*} # output: /dfs/acf/A1575A1BPK1/A1298/A129803C/A129803CAR/FORMAT # 变量截取从左向右贪婪匹配,也就是说从左往右贪婪匹配/,直到最后一个才停止 echo ${url##*/} # output: A3353A129803CAR.TXT echo -en '12345\n6789' | tr '\n' ',' echo echo "${url}" | tr -d '/' echo "${url}" | tr -s '/' '\'