我想增加具有以下结构的字符串形式传递的目录中的最后一个数字。
将传递的示例字符串是:/efs/etc/alex15_0
函数完成后,它将变为/efs/etc/alex15_1
我要增加的数字始终位于_
符号之后,该符号仅出现一次,它可以用作我假定的索引。它将以1递增,没有小数,只有规则的整数。
我尝试使用抓取最后一个字符
${str:$i:1}
但这显然不适用于99变成910的情况
在Java中,我将获取“ _”的索引,然后从该索引中将其子字符串转换为长度并将其递增。
str=/efs/etc/alex15_0
updateVer()
{
}
答案 0 :(得分:3)
以下应该可以解决问题:
$ str=/efs/etc/alex15_0
$ echo ${str%_*}_$((${str##*_}+1))
/efs/etc/alex15_1
此方法的工作方式是使用bash的3个功能:
删除匹配的前缀模式。 ${pattern%word}
用于删除最终数字并保留字符串的开头。
单词被扩展以产生模式,就像路径名扩展一样。如果该模式与参数的扩展值的结尾部分匹配,则扩展的结果是具有最短匹配模式(
%
情况)或最长匹配模式({{1 }}的情况下删除。
删除匹配的前缀模式: %%
用于给出
单词被扩展以产生模式,就像路径名扩展一样。如果模式与parameter的值的开头匹配,则扩展的结果为 具有最短匹配模式(
${parameter##word}
情况)或最长匹配模式(#
情况)的参数值。
算术扩展
算术扩展允许对算术表达式进行求值并替换结果。算术扩展的格式为:
##
答案 1 :(得分:2)
所有bash都不会扩展全局,以防它对某人有所帮助。
echo ${dir%${dir##*_}}$((${dir##*_}+1))
是的,您可以使用参数扩展作为参数扩展的修饰符。
$: dir=/efs/etc/alex15_0
$: echo ${dir##*_} # remove everything up to last underscore
0
$: echo ${dir%${dir##*_}} # remove everything *after* "everything after the last underscore"
/efs/etc/alex15_
$: echo $((${dir##*_}+1)) # show everything after last _, +1
1
$: echo ${dir%${dir##*_}}$((${dir##*_}+1)) # stack it all together
/efs/etc/alex15_1
与kvantour的解决方案基本相同,只是使用分层扩展。 :)
答案 2 :(得分:1)
如果您对awk
没问题,请尝试以下操作。
echo "$val" | awk 'BEGIN{FS=OFS="_"} {$NF+=1} 1'