我想知道如何使用bash修改版本号的最后一位。

例如

VERSION=1.9.0.9
NEXT_VERSION=1.9.0.10

编辑:版本号将只包含自然数。

解决方案是否可以通用,以处理版本号中的任何数量的部件。

例如
1.2
1.2.3
1.2.3.4
1.2.3.4.5

最佳答案

让我们从answer的基本froogz3301开始:

VERSIONS="
1.2.3.4.4
1.2.3.4.5.6.7.7
1.9.9
1.9.0.9
"

for VERSION in $VERSIONS; do
    echo $VERSION | awk -F. '{$NF = $NF + 1;} 1' | sed 's/ /./g'
done

我们如何对此进行改进?这里是从大量评论中提炼出来的一堆想法。

程序中的尾随“1”对其操作至关重要,但这并不是最明确的处理方式。最后的奇数“1”是一个 bool 值,它为true,因此匹配每行并触发默认操作(由于括号后没有任何操作),该操作将打印$ 0,即读取的行,由修改上一个命令。

因此,为什么不删除awk命令的sed命令呢?
awk -F. '{$NF+=1; OFS="."; print $0}'

当然,我们可以在几个阶段中进一步完善这些内容。您可以使用bash'<<
awk -F. '...' <<< $VERSION

下一个观察结果是,给定一系列行,一次执行awk可以处理所有这些行:
echo "$VERSIONS" | awk -F. '/[0-9]+\./{$NF+=1;OFS=".";print}'

没有for循环。 “$ VERSION”周围的双引号将字符串中的换行符保留。管道仍然是不必要的,从而导致:
awk -F. '/[0-9]+\./{$NF+=1;OFS=".";print}' <<< "$VERSIONS"

正则表达式仅通过处理包含数字后跟点的行来忽略$VERSION中的空行。当然,在每行中设置OFS有点笨拙,并且'+=1'可以缩写为'++',因此您可以使用:
awk -F. '/[0-9]+\./{$NF++;print}' OFS=. <<< "$VERSIONS"

(或者您可以在程序中包含“BEGIN{OFS="."}”,但这很冗长。

Bash仅支持'<<<'表示法,而不是Korn,Bourne或其他POSIX Shell支持(除非是与Bash表示法平行的非标准扩展名)。您可能会喜欢的任何版本的awk都将支持AWK程序(但旧的UNIX 7th Edition AWK不支持命令行上的变量分配)。

关于bash - 如何使用bash修改版本号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4485399/

10-12 23:24