微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linux Bash文件名自动编号而不删除前导零

对于Linux,我想自动以所使用的格式添加Oracle DB表空间.为此,与上一个文件相比,我想增加1.

通常使用以下格式来调用数据文件

/ora/oradata/tablespace_datafile.dbf
/ora/oradata/tablespace_datafile_02.dbf
/ora/oradata/tablespace_datafile_3.dbf

我能够用sed’s / [0-9].* //将$basefilename提取一个变量,其输出为:/ ora / oradata / tablespace_datafile_

我还能够用sed s / [^ 0-9] // g将数字提取到应该为$counter的变量中,这将作为上述示例的输出:分别为02和3.

但是,我很难在不删除前导零的情况下将1添加到$counter中(02应该在下一个03上,但是我得到了3.我正在使用let counter.

当前代码

basefilename=`echo $connectdb | sed 's/[0-9].*//'`
counter=`echo $connectdb | sed 's/[^0-9]//g'`
let counter++
nextdatafilename=$basefilename$counter'.dbf'

有什么建议么?

解决方法:

此bash函数将根据需要增加其数字参数,并保留前导零(请注意,语法高亮显示由${parameter ## word}参数扩展语法造成混淆):

inc() ( shopt -s extglob; printf "%0${#1}d" $((${1##+(0)} + 1)) )

例子:

$echo $(inc 1)
2
$echo $(inc 01)
02
$echo $(inc 001)
002
$echo $(inc 09)
10
$echo $(inc 009)
010
$echo $(inc 0)
1

根据您的情况使用它:

nextdatafilename="$basefilename$(inc $counter).dbf"

说明:

> printf“%0 ${#1} d”使用至少与参数包含的位数相同的数字格式化结果
> shopt -s extglob启用扩展的模式匹配,以便扩展${1 ##(0)}会删除所有前导零(这是必要的,因为前缀为零的数字被bash解释为八进制).
>函数主体用括号括起来,而不是用大括号括起来,因此shopt -s extglob的作用对于函数调用而言是局部的,并且不影响调用者的环境.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐