我正在尝试编写一个bash脚本,该脚本会增加
中给出的版本号{major}.{minor}.{revision}
例如。
1.2.13
有没有一种很好的方法可以使用像sed或awk这样的东西轻松提取这3个数字,这样我就可以增加{revision}数字并输出完整的版本号字符串。
答案 0 :(得分:47)
$ v=1.2.13
$ echo "${v%.*}.$((${v##*.}+1))"
1.2.14
$ v=11.1.2.3.0
$ echo "${v%.*}.$((${v##*.}+1))"
11.1.2.3.1
以下是它的工作原理:
字符串分为两部分。
${v%.*}
${v##*.}
第一部分按原样打印,后跟一个普通点,最后一部分使用shell算术扩展递增:$((x+1))
答案 1 :(得分:31)
使用数组的纯Bash:
version='1.2.33'
a=( ${version//./ } ) # replace points, split into array
((a[2]++)) # increment revision (or other part)
version="${a[0]}.${a[1]}.${a[2]}" # compose new version
答案 2 :(得分:15)
我喜欢这种事情的“剪切”命令
major=`echo $version | cut -d. -f1`
minor=`echo $version | cut -d. -f2`
revision=`echo $version | cut -d. -f3`
revision=`expr $revision + 1`
echo "$major.$minor.$revision"
我知道这不是最短的方式,但对我来说,最简单的理解和阅读......
答案 3 :(得分:7)
又一种贝壳方式(显示总有不止一种方法可以解决这些问题......):
$ echo 1.2.3 | ( IFS=".$IFS" ; read a b c && echo $a.$b.$((c + 1)) )
1.2.4
所以,我们可以这样做:
$ x=1.2.3
$ y=`echo $x | ( IFS=".$IFS" ; read a b c && echo $a.$b.$((c + 1)) )`
$ echo $y
1.2.4
答案 4 :(得分:6)
我使用shell自己的单词分裂;
之类的东西oIFS="$IFS"
IFS=.
set -- $version
IFS="$oIFS"
虽然由于字母或日期后缀以及其他恼人的不一致位,您需要小心版本号。在此之后,位置参数将设置为$version
:
$1 = 1
$2 = 2
$3 = 13
($IFS
是一组单个字符,而不是字符串,因此这不适用于多字符字段分隔符,但您可以使用IFS=.-
拆分.
或-
。)
答案 5 :(得分:4)
Awk非常简单:
echo "1.2.14" | awk -F \. {'print $1,$2, $3'}
将打印出1 2 14。
flag -F指定分隔符。
如果您想保存其中一个值:
firstVariable=$(echo "1.2.14" | awk -F \. {'print $1'})
答案 6 :(得分:1)
受到jlliagre答案的启发,我制作了自己的版本,支持版本号只有一个主要版本。 jlliagre的版本将使1 - > 1.2而不是2.
这个版本适用于两种版本号:
function increment_version()
local VERSION="$1"
local INCREMENTED_VERSION=
if [[ "$VERSION" =~ .*\..* ]]; then
INCREMENTED_VERSION="${VERSION%.*}.$((${VERSION##*.}+1))"
else
INCREMENTED_VERSION="$((${VERSION##*.}+1))"
fi
echo "$INCREMENTED_VERSION"
}
这将产生以下输出:
increment_version 1 -> 2
increment_version 1.2 -> 1.3
increment_version 1.2.9 -> 1.2.10
increment_version 1.2.9.101 -> 1.2.9.102
答案 7 :(得分:0)
fgm解决方案的小变化使用内置read
命令将字符串拆分为数组。请注意,IFS
变量的范围仅限于read
命令(因此无需存储和恢复当前的IFS
变量)。
version='1.2.33'
IFS='.' read -r -a a <<<"$version"
((a[2]++))
printf '%s\n' "${a[@]}" | nl
version="${a[0]}.${a[1]}.${a[2]}"
echo "$version"