linux变量内容的删除和替换
shell内置了对变量进行删除和替换的功能,非常的方便。虽然平时用的机会非常少,但是阅读别人写的脚本时,会经常遇到。所以进行一个学习总结。${var#pattern}从变量头部开始匹配模式,将符合的最短数据删除${var##pattern} 从变量头部开始匹配模式,将符合的最长数据删除${var%pattern}从变量尾部开始匹配模式,将符合的最短数据删除${var%%patte...
shell内置了对变量进行删除和替换的功能,非常的方便。虽然平时用的机会非常少,但是阅读别人写的脚本时,会经常遇到。
所以进行一个学习总结。
${var#pattern} 从变量头部开始匹配模式,将符合的最短数据删除
${var##pattern} 从变量头部开始匹配模式,将符合的最长数据删除
${var%pattern} 从变量尾部开始匹配模式,将符合的最短数据删除
${var%%pattern} 从变量尾部开始匹配模式,将符合的最长数据删除
${var/oldPattern/newPattern} 将第一个符合旧模式的数据替换为新模式
${var//oldPattern/newPattern} 将全部符合旧模式的数据替换为新模式
#和%是删除符号。在键盘上,#号在$的左边,所以是从左边开始删除,%在$符的右边,所以是从右边开始删除。
/是替换符。
最常用的场景:
1.输出文件的后缀
例如要判断文件的后缀名
var1=me.txt
echo ${var1#*.}
txt
用#会匹配上第一个点和之前的内容,删除掉之后就获得了后缀名txt。
var=me.pdf.txt
echo ${var##*.}
txt
假如文件名中本身含有点就会让上一种写法失效,此时应该用##来匹配最长数据。
2.输出文件名
类似上面的例子,这次是要输出文件名
echo ${var1%%.}
me
可见,%删除了从右边起第一个点及其右边的字符,剩下的就是文件名了。
echo ${var%.}
me.pdf
假如文件名中本身含有点也是会让上一种写法失效,此时用%来做最短匹配就行了。
3.替换部分字符
var=hello123hello123
echo ${var/123/456}
hello456hello123
echo ${var//123/456}
hello456hello456
可以看到第一个操作将首个123替换为456,第二个操作将所有123都变为456。
个人理解,shell只支持*号这个通配符,有匹配最短和最长数据这两种模式,没有完整的正则表达式支持。
在网上看到这样一段脚本:
##ipv4 or ipv6
tempIp="xxxx"
if [ "$tempIp" != "${#tempIp#*[0-9].[0-9]}" ]
then
##ipv4
else
##ipv6
fi
其作用是判断是ipv4地址还是ipv6地址。
其原理就是删除匹配这个规律的部分:开始任意个任意字符+1个数字+点号+1个数字
所以ipv4地址肯定能够匹配上。但是IPv6地址由于不包含点 号所以匹配不上。
root@debian2:~#
root@debian2:~# tempIp="192.168.0.103"
root@debian2:~#
root@debian2:~# echo ${tempIp#*[0-9].[0-9]}
68.0.103
root@debian2:~#
root@debian2:~#
root@debian2:~# tempIpv6="::1"
root@debian2:~#
root@debian2:~# echo ${tempIpv6#*[0-9].[0-9]}
::1
root@debian2:~#
但是,这个没有考虑到一种情况,就是IPv6兼容地址中,其实是含有点号的。
更简单的方法是判断IP地址中是否包含冒号。
##ipv4 or ipv6
tempIp="xxxx"
echo $tempIp | grep -q ":"
result=$?
if [ "$result" -eq 0 ]
then
##ipv6
else
##ipv4
fi
参考:
https://blog.csdn.net/qq_31567335/article/details/80035510
更多推荐
所有评论(0)