分离浮点量的整数部分和小数部分

昆虫养殖 暂无评论

在编写脚本需要获取系统内核版本判断部分特性的支持情况,但是实际上内核的版本数是累加的,并不是严格的数字意义上的大小比较。

例如内核版本 3.16 实际是大于 3.9 的,然而数字比较不能直接比较大小,因此需要分离浮点数的证书部分和小数部分,然后进行分开比较。

思路

分别获取一个浮点数的整数和小数部分,或者将一个文件的文件名和扩展名拆分开,可以考虑使用 cut 或者 awk 命令实现。

实现

分离浮点量的整数部分和小数部分有多种方式

方式一

使用 cut 实现

$ num1=3.1415 
$ echo $num1 | cut -d '.' -f1 
3 
$ echo $num1 | cut -d '.' -f2 
1415

方式二

使用 awk 实现

$ echo $num1 | awk -F '.' '{print $1}' 
3 
$ echo $num1 | awk -F '.' '{print $2}' 
1415

方式三

还有一种办法,更加高效和洁简,借助 % 操作符可以轻松将名称部分从“名称.扩展名”这种格式中提取出来

$ echo ${num1%.*} 
3 
$ echo ${num1#*.} 
1415

示例:

$ url=www.ibm.com 
$ echo ${url%.*} 
www.ibm 
$ echo ${url%%.*} 
www 
$ echo ${url#*.} 
ibm.com 
$ echo ${url##*.} 
com

例如可用下面的脚本来批量重命名文件(不考虑文件名有空格的情形),下面的脚本可以批量重命名所有的以 .jpg.png 结尾的图片。

#!/bin/bash
# filename: batchrename.sh
# Rename jpg and png files
count=1
# maxdepth参数尽量靠前是一个很好的习惯,可以避免find深度查找
for oldName in `find /tmp-maxdepth 1 -iname '*.png' -o -iname '*.jpg' -type f`
do
newName=image-$count.${oldName##*.}
mv $oldName $newName
let count++
done

运行效果如下

$ find /tmp  -maxdepth 1 -iname '*.png' -o -iname '*.jpg' -type f
/tmp/MyBG1a.jpg
/tmp/V1uBkW4.jpg
/tmp/XXxxzyFr.png
/tmp/A8hB3An8ey.png
/tmp/XXxxeb5t.PNG
$ bash rename.sh
$ find /tmp  -maxdepth 1 -iname '*.png' -o -iname '*.jpg' -type f
/tmp/image-5.PNG
/tmp/image-1.jpg
/tmp/image-2.jpg
/tmp/image-4.png
/tmp/image-3.png

附录

参考链接

本文撰写于一年前,如出现图片失效或有任何问题,请在下方留言。博主看到后将及时修正,谢谢!
回复
回答20+16=